我有一个角度控制器:
.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.
为什么在这种情况下有必要?
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)