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

带角度表达式绑定的无限循环

易炳
2023-03-14
问题内容

我有一个角度应用程序,它通过简单的表达式绑定显示由控制器方法返回的值:

<div>{{getValue()}}</div>

如果所讨论的方法仅返回一个值,则该方法将被调用两次,这很奇怪:

$scope.getValue = function(){
  return 'some value';
}

但是,如果该方法执行一些异步工作,例如从服务器获取文件,则代码将进入无限循环:

$scope.getValueAsync = function(){
  $http.get('myfile.html')
    .success(function (data, status, headers, config) {
      return 'some async value';
    });

  return 'file not found'; // same value returned every time but $digest cycle still loops
}

我是Angular的新手,所以这里可能错过了一些基本的知识,但是有人可以解释一下发生了什么吗?

柱塞

这是一个与http://plnkr.co/7BriYDbdVJvIoIigQcTU一起玩的朋克


问题答案:

即使您的异步函数每次都返回相同的字符串,由于循环使用$ http服务进行ajax调用,因此$ digest循环也会在循环中触发。

$ http服务$rootScope.$apply()
在请求完成时触发,并且由于$apply触发$
digest循环,因此它会重新评估视图表达式,这反过来又导致您的异步函数被再次调用,依此类推…

app.controller('MainCtrl', function($scope, $http) {

  $scope.getValue = function(){
    return 'some value';
  }

  $scope.getValueAsync = function(){
    $http.get('myfile.html')
      .success(function (data, status, headers, config) {
        return 'some async value';
      });

    return 'file not found';
  }
});



<div>{{getValueAsync()}}</div>

故事的寓意 :如果在表达式中使用函数,请确保函数不会影响会触发$
digest循环的函数之外的事物,并确保在给定相同输入的情况下,函数始终返回相同的输出。



 类似资料:
  • AngularJS自1.3.0-beta.10版本以来有一个新功能:“惰性一次性绑定”。 简单表达式的前缀可以是<代码>:: ,告诉angular在首次计算表达式后停止监视。给出的常见示例如下: 下面的表达式有类似的语法吗?

  • 问题内容: 我正在解析(种类)表格的名称: 通常有两个项(二项式),但有时有3个或更多。 我写 大部分时间都有效,但偶尔会陷入无限循环。花了一些时间来查找正则表达式匹配中的内容,然后我才意识到这是一个错字,我应该写 正确执行。 我的问题是: 为什么会发生这种循环? 有没有办法在运行程序之前检查类似的正则表达式错误?否则,可能很难在prgram分发之前就将它们捕获并引起问题。 [注意:我不需要物种的

  • 问题内容: 自1.3.0-beta.10版本以来,AngularJS具有一项新功能:“懒惰的一次性绑定”。 可以在简单表达式的前面加上,告诉angular在首次评估表达式后停止观看。给出的常见示例如下所示: 类似以下表达式的语法是否类似? 问题答案: 是。您可以在每个表达式前添加,甚至可以在或中添加前缀: 实际上,代码只是检查表达式中的前两个字符是为了激活一次性绑定(然后将其删除,因此甚至不需要括

  • 问题内容: 我想在ng-repeat属性中调用函数,这是我的代码 示例plnkr html js 当我打开控制台时,我注意到了错误 我的代码的主要目标是在ng-repeat中使用函数来计算每个事件循环中的数据 问题答案: 找到了解决方案:

  • 编辑问题包括期望的行为, 我正在编写一个Angular 2应用程序,我不明白为什么Angular不能正确使用

  • 问题内容: 我正在编写一个自定义Angular过滤器,该过滤器随机大写传递给它的输入。 这是代码: 我这样称呼它: 它可以工作,但是在我的控制台中,我看到了rootScope:infdig(无限摘要)循环。 我在理解为什么会发生这种情况以及如何解决此问题时遇到了一些麻烦。如果我理解正确,这是由于该函数调用了5个以上摘要操作。但是输入仅由过滤器调用一次,对吗? 任何帮助表示赞赏。 问题答案: 由于摘