我对ng-change和ng-model“如何协同工作”的理解是,对于具有N个元素的数组,如果我在视图中使用ng-repeat将当前索引绑定到ng-模型,然后将ng-change函数绑定到每个元素,然后在视图初始化时, ng-change函数将至少触发N次。事实证明我错了,这里是为了了解原因。
一些代码可以进一步解释:
$scope.quiz = {
sections: [
{
questions: [
{
value: 0,
title: "Question 1"
}
]
},
{
questions: [
{
value: 0,
title: "Question 1"
},
{
value: 0,
title: "Question 2"
}
]
}
]
};
我的数据集与我上面发布的数据集有些相似,在我看来,我使用ng-repeat为每个部分中的每个问题生成输入元素;类似的东西:
<!-- Loop through each section -->
<div ng-repeat="section in quiz.sections">
<!-- Loop through each question -->
<input type="number" ng-repeat="question in section.questions" ng-model="question.value" ng-change="change()"/>
</div>
我的ng-change功能相当密集,在页面加载时无需执行此密集代码,执行驴工作的代码只需在用户与视图交互时触发。
所以我定义了一个计数器来跟踪ng-change被触发的次数,当它达到它的MAX值(这是我的数据结构中的问题数)时我假设页面已经完成初始化然后在我的ng-change函数中我定义一个新函数并设置ng-change函数来引用它,因此处理用户交互的代码不会在初始化时运行。
沿着以下几点:
var count = 0; //Keep track of how many times change has been fired
var MAX = quiz.getQuestionCount(); //How many questions in the quiz
$scope.change = function() {
/*
Do nothing for now
*/
/*
* Once this has been fired MAX times, assign the 'actual logic'
* to the change function.
*
* MAX is not being reached...
*/
if(count >= MAX) {
$scope.change = function() {
/*
Some intensive computation that doesn't need
to be invoked during the 'initial load' of the page
...
...
*/
};
}
};
问题是计数&lt; MAX一旦页面加载,我原本以为ng-change会在每次ng-repeat迭代遍历在视图编译过程中给出的数据集时被触发,上面的例子告诉我我错了。
当然,如果我做一些不合逻辑的事情:
if(count >= MAX / 2) {
//This gets triggered
}
但我自然不会依赖'魔术':)。
问题:
如果我有一个包含30个元素的数组并且对它们进行ng-repeat分配ng-model和ng-change值,我希望ng-change在页面(即控制器)时至少被触发30次)加载,这似乎不是真的,任何人都可以解释为什么?
我的理解是初始化ng-model值应该触发更改事件,如果在上面的示例中加载页面时执行的ng-change少于30次,则不会出现这种情况。