【问题标题】:Angularjs ng-if function getting called multiple times [duplicate]Angularjs ng-if函数被多次调用[重复]
【发布时间】:2016-11-07 08:18:51
【问题描述】:

我在 ng-if 中调用控制器函数,如下所示,但是 checkUserExamEnrollment 函数被重复调用。任何人都可以建议代码中有什么问题吗?

查看:

<div ng-if="checkUserExamEnrollment()== 0">Sample Data here if ng-if true</div>

控制器:

$scope.checkUserExamEnrollment = function()
    {
        var url = "http://localhost/api/examnew";

        return $http.get(url);
    }

【问题讨论】:

  • 是在ng-repeat里面吗?
  • 不,它不在 ng-repeat 中
  • 是的,ng-if 将在摘要循环运行(多次)时评估其表达式,基本上你不应该从 ng-if 表达式进行 ajax 调用
  • 这是一个主要的设计缺陷。首先,您的函数不会返回任何内容,因此永远不会满足条件。接下来,您应该了解摘要循环是如何工作的,并且永远不应该从这样的功能发出$http 请求。你想做什么?

标签: javascript jquery angularjs


【解决方案1】:

如果您的 http 调用返回一个对象或数组,那么您可以将其存储在 Scope 变量中(例如:$scope.result)并使用:

    <div ng-if="result">Sample Data here if ng-if true</div>

这将检查 $scope.result 的内容并仅在它不为 null 时显示。

希望对你有帮助

【讨论】:

    【解决方案2】:

    您的ng-if 将在每个摘要循环中被调用。问题是它包含一个涉及函数调用的表达式。 Angular 无法知道表达式的结果何时会改变,所以它每次都会调用它。

    $digest 循环运行时,将执行观察程序以查看范围模型是否已更改。如果有,则调用相应的侦听器函数。这就引出了一个重要的问题。如果侦听器函数本身改变了作用域模型怎么办? AngularJS 将如何解释这种变化?

    答案是$digest 循环不会只运行一次。在当前循环结束时,它会重新开始检查是否有任何模型发生了变化。这基本上是脏检查,并且是为了解释侦听器函数可能已经完成的任何模型更改。因此,$digest 循环会一直循环,直到不再有模型更改,或者达到最大循环次数 10。

    【讨论】:

      猜你喜欢
      • 2013-04-03
      • 2016-05-04
      • 2016-03-28
      • 2016-11-29
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      相关资源
      最近更新 更多