Javascript 具体什么时候调用ng checked

Javascript 具体什么时候调用ng checked,javascript,angularjs,checkbox,angular-material,Javascript,Angularjs,Checkbox,Angular Material,在使用AngularMaterial时,我检查了ng如下: <md-list> <md-list-item ng-repeat="option in options"> <p> {{ option }} </p> <md-checkbox class="md-secondary" aria-label="{{$index}}" ng-checked="exists($index)" ng-click="to

在使用AngularMaterial时,我检查了
ng
如下:

<md-list>
    <md-list-item ng-repeat="option in options">
       <p> {{ option }} </p>
       <md-checkbox class="md-secondary" aria-label="{{$index}}" ng-checked="exists($index)" ng-click="toggle($index)"></md-checkbox>
    </md-list-item>
</md-list> 
我的计时器:

function updateTimer() {
    var onTimeout = function(){
      mytimeout = $timeout(onTimeout,1000);
    }
    var mytimeout = $timeout(onTimeout,1000);
}

这样,每秒都会调用
$scope.exists
函数。有人能解释一下
ng checked
$timeout
的关系吗?如何避免这种情况呢?

ng检查过了,就像angular的许多指令都是基于手表一样。每当调用摘要循环时,它都会评估所有观察者(您使用的函数就是其中之一)。因此,每次$timeout求值时,它都会启动一个新的$digest循环并求值所有的观察者。这是“魔法”的一部分,它使用控制器和指令中的所有数据更新视图

如果您使函数变得复杂,或者创建了大量的观察程序,那么观察程序可能会成为性能问题。一般来说,最好使用能快速返回真或假的简单逻辑,并避免在所有内容上设置手表。

一个词的原因是:。由于您的函数绑定到视图,所以每次发生摘要循环时,这些表达式都会作为脏检查的一部分进行计算,以确保是否需要更新相应的DOM。这与角度材质无关,它是角度实现的核心。现在,在您的例子中,您正在无限地调用
$timeout
,这意味着在每次超时执行后
摘要
循环都会执行脏检查

现在您所拥有的一切都很好,但是只要您
将函数绑定到DOM(作为视图绑定、插值或属性状态属性甚至DOM过滤器的一部分,当然事件都很好)您应该意识到这样一个事实,即当应用程序增长时,您不会意外或有意地在该功能中执行大量操作,这将减慢整个应用程序的速度,并且当应用程序变得更大并且问题开始发生时,重构和诊断将变得困难。尽可能多地绑定到属性而不是函数。请注意,即使您绑定了一个属性,
$parse
仍会在其上创建一个getter,并将其添加到
$$watchers
队列中,以便在每个摘要周期进行脏检查,但区别在于它是一个简单的getter函数

因此,基本上,例如在您的案例中,您可以将
ng checked
绑定到属性

..ng-checked="doesExist"

并在需要更新时设置属性
doesExist
。因此,与每次检查是否存在不同,您可以在相应的事件发生时显式设置相应的属性。这也使得逻辑清晰明了。

我只是想知道,我自己,他们甚至没有时间读它!更新,从我所读到的每件事来看,只要你保持他们的速度和数量合理,观察者是好的
..ng-checked="doesExist"