什么时候可以安全使用$ scope $ apply()?

教育网编2023-04-06 17:141880

如果您想使用API​​-Rest-Call,请promise在您Controller的Rest-Call内设置作用域,而不要使用return。

$http.get('uri')
  .success(function(data) {
    $scope.items = data
});

避免使用$apply 。从Angular GitHub Repo:

$scope.$apply 应尽可能接近异步事件绑定发生。

如果这样做 (!$scope.$$phase) $scope.$apply 是因为您在调用堆栈中不够高。

对你的问题:

  • 如果发现自己需要$ apply()的情况,请重新考虑您的结构。
  • 出于安全原因:请勿使用 $apply

解决方法

我想标题很清楚我要问的内容。我创建了这个小提琴:http :
//jsfiddle.net/Sourabh_/HB7LU/13142/

在小提琴中,我试图复制一个async场景。这只是一个示例,但是在AJAX调用中,如果我不使用$scope.$apply 该列表,则不会更新。我想知道$scope.$apply 每次进行AJAX调用来更新列表时是否可以安全使用?是否可以使用其他机制?

我编写的用于复制场景的代码(与小提琴相同):

的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);
  }
}

评论区