Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数内部ng重复调用4次(AngularJs)_Javascript_Angularjs_Frontend - Fatal编程技术网

Javascript 函数内部ng重复调用4次(AngularJs)

Javascript 函数内部ng重复调用4次(AngularJs),javascript,angularjs,frontend,Javascript,Angularjs,Frontend,以下HTML代码用21部手机填充ul: <li ng-repeat="phone in phones" ng-class="{'digestTest': countDigestOccurences(phone) }"> <p>{{phone.snippet}}</p> </li> 通过这种方法,我可以清楚地看到,CountDigestEvents在每个电话中被呼叫4次。 我不能,为了我的生命,弄明白为什么它被称为4次 更新: 即使手机项目的H

以下HTML代码用21部手机填充ul:

<li ng-repeat="phone in phones" ng-class="{'digestTest': countDigestOccurences(phone) }">
  <p>{{phone.snippet}}</p>
</li>
通过这种方法,我可以清楚地看到,CountDigestEvents在每个电话中被呼叫4次。 我不能,为了我的生命,弄明白为什么它被称为4次

更新:

即使手机项目的HTML如下所示,周期数仍将保持为4:

    <li ng-repeat="phone in phones "
        class="thumbnail phone-listing" ng-class="{ 'digestTest': countDigestOccurences(phone),  'digestTestAgain': randomMethodDoesNothing() }">
      <p>{{phone.snippet}}</p>
    </li>

您通过$http进行了多少次ajax调用?每一个都会触发一个$digest。此外,如果某些内容发生了更改,并且新数据已经到达,则将运行另一个$digest以确保它涵盖所有内容


要避免这种情况,请在父元素的ng if上添加一个布尔值,并在所有ajax调用到达后将其设置为true。请参阅$q。

您通过$http进行了多少ajax调用?每一个都会触发一个$digest。此外,如果某些内容发生了更改,并且新数据已经到达,则将运行另一个$digest以确保它涵盖所有内容


为了避免这种情况,在父元素的ng if上添加一个布尔值,并在所有ajax调用到达后将其设置为true。请参见$q。

当Angular编译并在视图上查看表达式时,如ng class=function,ng model=toto,会为其创建一个$watch。在每个摘要循环中,通过脏检查来评估手表,以确定模型中是否有任何变化

因此,在您的ng repeat中,您有:电话集合上的一个观察者,每个电话实例上的一个观察者,以及函数上的一个观察者。由于视图上的函数不是范围变量,angular无法知道函数的结果是否已更改。您可能会影响函数中的其他范围变量,因此,它会重新评估每个摘要周期的函数结果

所以你有电话+电话+功能+最后一个摘要周期来验证一切正常:4个周期

一个好的做法是不在视图中使用函数,除非在罕见的情况下。相反,将函数的结果存储在范围变量中,并在视图中呈现该变量

更新:

由于下面的讨论,请注意,仅为ng class指令创建了一个watch si,它对应于ng class的值。即,具有: ng class={'toto':functionOne,'titi':functionTwo},手表打开:{'toto':functionOne,'titi':functionTwo}。
由AngularJs指令代码发出:scope.$watchattr[name],ngClassWatchAction,true

当Angular编译并在视图上查看表达式时,如ng class=function、ng model=toto,将为其创建$watch。在每个摘要循环中,通过脏检查来评估手表,以确定模型中是否有任何变化

因此,在您的ng repeat中,您有:电话集合上的一个观察者,每个电话实例上的一个观察者,以及函数上的一个观察者。由于视图上的函数不是范围变量,angular无法知道函数的结果是否已更改。您可能会影响函数中的其他范围变量,因此,它会重新评估每个摘要周期的函数结果

所以你有电话+电话+功能+最后一个摘要周期来验证一切正常:4个周期

一个好的做法是不在视图中使用函数,除非在罕见的情况下。相反,将函数的结果存储在范围变量中,并在视图中呈现该变量

更新:

由于下面的讨论,请注意,仅为ng class指令创建了一个watch si,它对应于ng class的值。即,具有: ng class={'toto':functionOne,'titi':functionTwo},手表打开:{'toto':functionOne,'titi':functionTwo}。
由AngularJs指令代码发出:scope.$watchattr[name],ngClassWatchAction,true

ng类在每个摘要周期中都进行评估,不仅是在ng类中插入项目时,而且为什么会有4个摘要周期?每个是多少美元?我以前没见过。@JoeLloyd看起来像是jQuery,每个函数都可以计算angular的工作方式,angular可以在任何时候运行,ng类在每个摘要周期中都进行评估,不仅是在ng类中插入项目时,而且为什么会有4个摘要周期?每个是多少美元?我以前没见过。@JoeLloyd看起来像是jQuery,每个函数都可以计算angular的工作方式,angular可以在任何时候运行,无,这是静态数据。这是一个计算摘要周期的项目。静态数据,但在服务器端API或json文件上。在UI上,您通过HTTP获取它,使其成为动态的。无,这是静态数据。这是一个计算摘要周期的项目。静态数据,但在服务器端API或json文件上。在UI上,您可以通过HTTP获取它,使其成为动态的。如果是这样,我在答案底部输入的代码现在不会将周期从4增加吗?代码不符合标准,因为这是一个项目测试摘要周期。我不明白为什么您添加的代码会增加摘要的数量。为了清晰起见,再次更新。我在ng类中引入了一个新函数。这不应该再加一块手表吗
所以又是一个循环?不,因为您总是在同一个电话实例上工作,即使您添加phone.imageUrl、phone.id,。。。这是观察到的phone对象,而不是它的属性是的,但是我现在添加了另一个功能。一个函数不需要我理解的另一个循环吗?如果是这样的话,我放在答案底部的代码现在不是从4增加了循环吗?代码不符合标准,因为这是一个项目测试摘要周期。我不明白为什么您添加的代码会增加摘要的数量。为了清晰起见,再次更新。我在ng类中引入了一个新函数。这不应该添加另一个观察者,从而增加另一个周期吗?不,因为您总是在同一个电话实例上工作,即使您添加phone.imageUrl、phone.id,。。。这是观察到的phone对象,而不是它的属性是的,但是我现在添加了另一个功能。从我的理解来看,函数不需要另一个循环吗?
    <li ng-repeat="phone in phones "
        class="thumbnail phone-listing" ng-class="{ 'digestTest': countDigestOccurences(phone),  'digestTestAgain': randomMethodDoesNothing() }">
      <p>{{phone.snippet}}</p>
    </li>