我想标题很清楚我要问的内容。我创建了这个小提琴:http : //jsfiddle.net/Sourabh_/HB7LU/13142/
在小提琴中,我试图复制一个async场景。这只是一个示例,但是在AJAX调用中,如果我不使用$scope.$apply()该列表,则不会更新。我想知道$scope.$apply()每次进行AJAX调用来更新列表时是否可以安全使用?是否可以使用其他机制?
async
$scope.$apply()
我编写的用于复制场景的代码(与小提琴相同):
的HTML
<div ng-controller="MyCtrl"> <li ng-repeat="item in items"> {{item.name}} </li> <button ng-click="change()">Change</button> </div>
JS
var myApp = angular.module('myApp',[]); function MyCtrl($scope) { $scope.items = [{name : "abc"},{name : "xyz"},{name : "cde"}]; $scope.change = function(){ test(function(testItem){ $scope.items = testItem; //$scope.$apply(); }) } function test(callback){ var testItem = [ {name : "mno"}, {name : "pqr"}, {name : "ste"} ]; setTimeout(function(){callback(testItem)},2000); } }
如果您想使用API-Rest-Call,请promise在您Controller的Rest-Call内设置作用域,而不要使用return。
promise
Controller
$http.get('uri') .success(function(data) { $scope.items = data });
避免使用$apply()。从Angular GitHub Repo:
$apply()
$scope.$apply() 应尽可能接近异步事件绑定发生。 不要在整个代码中随意散布它。 如果这样做 (!$scope.$$phase) $scope.$apply()是因为您在调用堆栈中不够高。
$scope.$apply() 应尽可能接近异步事件绑定发生。
不要在整个代码中随意散布它。 如果这样做 (!$scope.$$phase) $scope.$apply()是因为您在调用堆栈中不够高。
(!$scope.$$phase) $scope.$apply()
对你的问题: