gpt4 book ai didi

angularjs - 对 $scope.$apply 的需要感到困惑

转载 作者:行者123 更新时间:2023-12-04 04:21:24 25 4
gpt4 key购买 nike

我有一个 Angular Controller :

.controller('DashCtrl', function($scope, Auth) {
$scope.login = function() {
Auth.login().then(function(result) {
$scope.userInfo = result;
});
};
});

这是使用我创建的服务:
.service('Auth', function($window) {
var authContext = $window.Microsoft.ADAL.AuthenticationContext(...);

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

};
});

Auth 服务正在使用一个 Cordova 插件,该插件将在 angular 世界之外。我想我不清楚你什么时候需要使用 $scope.$apply更新您的 $scope 以及何时不更新。我的错误假设是因为我已将逻辑包装到一个 Angular 服务中,所以在这种情况下我不需要它,但除非我包装 $scope.userInfo =,否则不会更新任何内容。 $timeout 中的声明或 $scope.$apply .

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

最佳答案

来自 angular's wiki :

AngularJS provides wrappers for common native JS async behaviors:

...

jQuery.ajax() => $http

This is just a traditional async function with a $scope.$apply() called at the end, to tell AngularJS that an asynchronous event just occurred.



所以我猜因为你的 Auth服务不使用 angular 的 $http , $scope.$apply()执行异步后,angular 不会调用 Auth功能。

Whenever possible, use AngularJS services instead of native. If you're creating an AngularJS service (such as for sockets) it should have a $scope.$apply() anywhere it fires a callback.



编辑:

在您的情况下,您应该触发 digest cycle一旦通过包装更新模型(如您所做的那样):
Auth.login().then(function(result) {
$scope.$apply(function(){
$scope.userInfo = result;
});
});

或者
Auth.login().then(function(result) {
$scope.userInfo = result;
$scope.$apply();
});

关于angularjs - 对 $scope.$apply 的需要感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35072031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com