当前位置: 首页 > 面试题库 >

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

丁星火
2023-03-14
问题内容

我想标题很清楚我要问的内容。我创建了这个小提琴: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);
  }
}

问题答案:

如果您想使用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()


 类似资料:
  • 问题内容: 我正在开发JSON / REST Web API,为此,我特别希望第三方网站能够通过AJAX调用我的服务。因此,我的服务正在发送著名的CORS标头: 允许第三方站点通过AJAX调用我的服务。到目前为止一切都很好。 但是,我的Web api的一个子部分是非公开的,需要身份验证(带有OAuth和access_token cookie的相当标准的东西)。在我网站的此部分也启用CORS是否安全

  • 问题内容: 我一直在阅读有关Android内存泄漏的文章,并观看了来自Google I / O的有关该主题的有趣视频。 尽管如此,我还是不完全理解这个概念,尤其是当Activity中的用户内部类是安全或危险的时候。 这是我的理解: 如果内部类的实例生存时间长于外部类(活动),则将发生内存泄漏。-> 在什么情况下会发生这种情况? 在此示例中,我假设不存在泄漏的风险,因为匿名类扩展不会比活动寿命更长,

  • 问题内容: 我从jls找到了报价: 相等运算符可用于比较两个可转换(第5.1.8节)为数字类型的操作数,或两个boolean或Boolean类型的操作数,或 两个分别为引用类型或null类型的操作数 。所有其他情况都会导致编译时错误。 但是这段代码 每个操作数都是参考! 说这是不兼容的类型。 jls在哪里说这些类型应该兼容? 问题答案: 在15.21.3节(参考相等运算符==和!=)中: 如果无法

  • 我找到了JLS引文: 表示它是不兼容的类型。 在jls中哪些地方说这些类型应该兼容?

  • 问题内容: 奇怪的是: 似乎或多或少被定义为。通过这种方式很容易产生错误: 一些fname意外地以else块结尾。修复很简单,我们应该改用它,但是从表面上看,这似乎是一种不错的pythonic方式,并且比“正确”的方式更具可读性。 由于字符串是不可变的,所以为什么字符串错误是什么技术细节?什么时候进行身份检查更好,什么时候进行平等检查更好? 问题答案: 据我所知,检查对象身份是否相等。由于没有强制

  • 已弃用。这种方法本质上是不安全的。使用thread.Stop停止线程会导致它解锁它锁定的所有监视器(作为未检查的ThreadDeath异常向堆栈上传播的自然结果)。如果以前由这些监视器保护的任何对象处于不一致的状态,则损坏的对象将对其他线程可见,从而可能导致任意行为。stop的许多用法应该被简单修改某个变量以指示目标线程应该停止运行的代码所取代。目标线程应该定期检查这个变量,如果变量指示它要停止运