对$ scope的需求感到困惑.$ apply

Dis*_*ile 6 angularjs

我有一个角度控制器:

.controller('DashCtrl', function($scope, Auth) {
    $scope.login = function() {
        Auth.login().then(function(result) {
            $scope.userInfo = result;
        });
    };
});
Run Code Online (Sandbox Code Playgroud)

哪个使用我创建的服务:

.service('Auth', function($window) {
    var authContext = $window.Microsoft.ADAL.AuthenticationContext(...);

    this.login = function() {
        return authContext.acquireTokenAsync(...)
            .then(function(authResult) {
                return authResult.userInfo;
            });

    };
});
Run Code Online (Sandbox Code Playgroud)

Auth服务使用的是Cordova插件,该插件位于角度世界之外.我想我不清楚何时需要使用a $scope.$apply来更新你的$ scope而你不需要.我的错误假设是因为我已将逻辑包装到角度服务中,然后在这个实例中我不需要它,但除非我将$scope.userInfo =语句包装在$timeout或中,否则什么都不会更新$scope.$apply.

为什么在这种情况下有必要?

Dan*_*iel 5

angular的Wiki中

AngularJS为常见的本地JS异步行为提供了包装器:

...

jQuery.ajax()=> $ http

这只是一个传统的异步函数,最后带有$ scope。$ apply()来告诉AngularJS异步事件刚刚发生。

因此,我想因为执行Async 函数后,您的Auth服务未使用angular的服务$http$scope.$apply()所以不会被angular Auth调用。

尽可能使用AngularJS服务而不是本机服务。如果您要创建AngularJS服务(例如用于套接字),则在触发回调的任何地方都应具有$ scope。$ apply()。

编辑:

对于您的情况,一旦通过包装更新模型(如您所做的那样),就应该触发摘要周期

Auth.login().then(function(result) {
   $scope.$apply(function(){
      $scope.userInfo = result;
   });
});
Run Code Online (Sandbox Code Playgroud)

要么

Auth.login().then(function(result) {
    $scope.userInfo = result;
    $scope.$apply();
});
Run Code Online (Sandbox Code Playgroud)