当前位置: 首页 > 面试题库 >

服务变量未在控制器中更新

帅雅逸
2023-03-14
问题内容

我有一个ng-
view以外的NavbarCtrl。我有一个与服务对话以使用户登录的登录控制器。用户登录后,我希望导航栏更新为用户的电子邮件地址。但是,对我而言,一旦用户登录,我似乎无法让Navbar范围更新加载到我的“
Auth”服务中的数据。

这是我的主要index.html:

<div class="navbar navbar-inverse navbar-fixed-top">

        <div class="navbar-inner">
            <div class="container">
                <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </a>
                <a class="brand" href="#">Brim</a>

                <div class="pull-right"  ng-controller="NavbarCtrl">
                    <div ng-click="refresh()">hello</div>
                    {{ user.email }}
                </div>
            </div>
        </div>

    </div>

    <div class="container" ng-view>

而我的服务:

.factory('Auth', function($resource) {
    var authenticated = false;
    var user = {};
    return {
        isAuthenticated: function () {
            return authenticated;
        },
        getUser: function() {
            return user;
        },
        login: function(loginUser, callback) {
            user =  {email:'email@email.com'}
            authenticated = true;
            callback(true);
            //actual code for logging in taken out for brevity
        }
    }
})

还有我的Login和Navbar控制器:

function LoginCtrl($scope, $location, Auth) {

$scope.login = function() {
    Auth.login($scope.user, function(success) {
        if(success) $location.path('/dashboard');
        //console.log(Auth.getUser())
    });
}

}

function NavbarCtrl($scope, Auth)  {

//thought this should work
$scope.user = Auth.getUser();

//experimenting unsuccessfully with $watch
$scope.$watch(Auth.isAuthenticated(),function () {
    $scope.user = Auth.getUser()
})

//clicking on a refresh button is the only way I can get this to work
$scope.refresh = function() {
    $scope.user = Auth.getUser()
}
}

从我的研究中,我会认为$ scope.user = Auth.getUser();
可以正常工作,但事实并非如此,我完全不知道如何在用户登录后更新Navbar。在此先感谢您的帮助。


问题答案:

更新 :好吧,您每天都会学到一些新东西…只需删除()即可查看函数的结果:

$scope.$watch(Auth.isAuthenticated, function() { ... });

[Updated fiddle](http://jsfiddle.net/mrajcok/wzECr/2/)

在这个小提琴中,请注意,当值$scope.isAuthenticated更改时,“ watch1”和“ watch3”如何触发第二次。

因此,这是 监视 服务上定义的 原始 值的更改的通用技术:

  • 定义返回原语(值)的API /方法
  • $看那个方法

监视对 服务上定义的 对象或数组的 更改

  • 定义返回对象/数组(对其的引用)的API /方法
  • 在服务中,请注意仅修改对象/数组,不要重新分配它。
    例如,不要这样做:user = ...;
    而是,这样做: angular.copy(newInfo, user)或这样:user.email = ...

  • 通常,您将为该方法的结果分配一个本地$ scope属性,因此$ scope属性将是对实际对象/数组的引用

  • $ watch范围属性

例:

$scope.user = Auth.getUser();
// Because user is a reference to an object, if you change the object
// in the service (i.e., you do not reassign it), $scope.user will
// likewise change.
$scope.$watch('user', function(newValue) { ... }, true);
// Above, the 3rd parameter to $watch is set to 'true' to compare
// equality rather than reference.  If you are using Angular 1.2+
// use $watchCollection() instead:
$scope.$watchCollection('user', function(newValue) { ... });

原始答案:

要观察一个函数的结果,您需要传递$ watch一个包装该函数的函数

$scope.$watch( function() { return Auth.isAuthenticated() }, function() { ... });

小提琴。在小提琴中,请注意,当值$scope.isAuthenticated更改时,只有“
watch3”如何触发第二次。(它们都最初触发,作为$ watch初始化的一部分。)



 类似资料:
  • 问题内容: 我有一个变量,将由一个或多个控制器使用,由服务更改。在那种情况下,我建立了一个服务来将该变量保存在内存中,并在控制器之间共享。 问题是:每次变量更改时,控制器中的变量都不会实时更新。 我创建这个小提琴来提供帮助。http://jsfiddle.net/ncyVK/ -–请注意,当我增加count的值时,或永远不会更新。 如何将Service / Factory变量绑定到Controll

  • 问题内容: 我在我的angular js项目中遇到了$ scope的麻烦。例如,当我在输入字段上使用ng-model =“ modelExample”时,我无法使用$ scope.modelExample在我的js中访问它。还有其他人有类似的问题吗? 这很奇怪,调用了一个函数,但是ng-model没有绑定。请参阅下面的代码,当我提交表单时,将调用refreshResults()函数,但$ scop

  • 问题内容: 在我的指令中,我有一个控制器变量,页面在您按指令中的按钮时会增加。但是,调用控制器功能的下一行不会反映此更改。请注意,当您单击按钮页面时,其警报仍为1! 我知道我可以通过在控制器中添加$ scope。$ apply来解决此问题,但随后出现错误,提示摘要已在进行中。 柱塞 html模板: 问题答案: 它之所以不能立即显示更新的值,是因为2方式绑定仅在摘要周期内才更新父(或指令的使用者范围

  • 我正在尝试使用< code>Auth::user()- 我已经检查并包含了所需的文件,我正在从用户表中获取用户 我在调用变量并将其发布到控制器函数中的DB时遇到问题。任何帮助都可以。 将User表中的User发布到Tokens表的中,以便我可以使用模型 出现此错误: SQLSTATE[23000]:完整性约束冲突:19非空约束失败:令牌。user_id(SQL:插入“令牌”(“token1”、“t

  • 问题内容: 我已经阅读了几篇有关angularjs实体正确用法的文章:服务,工厂,控制器和指令。 我特别关心的是控制器和服务的比较。但是,没有一个帖子告诉我什么是控制器可以执行服务不能执行的操作,反之亦然。 可以列出它吗?或者仅仅是在angular的用法上规范? 问题答案: 控制器 通常用于绑定视图。控制器管理视图的生命周期,应将其视为视图控制器。将为视图的每个实例创建一个新的控制器,这意味着,如

  • 我知道有很多关于传递参数的线程,但我仍然不明白。 我有阶段与类。在这个类中,我创建了例如变量。然后我单击此阶段上的按钮,它使用创建新阶段,我可以在其中修改此值。在中是值的setter和getter方法。在中,我可以从中获取值并对其进行编辑,但最后当我关闭第二阶段时,我尝试通过中的setter方法将此编辑后的值设置为新数字。然后我关闭它,然后像第一次一样再次打开它。但是我看不到新的编辑值,我再次看到