这是html:
<select style="width: 100%;" ng-model="vm.orgType" ng-model-options="{getterSetter: true}" ng-options="orgType as orgType.ORGANIZATION_TYPE for orgType in vm.orgTypes">
</select>
这里是getter / setter函数:
function orgType(selectedType) {
if (arguments.length == 0)
return orgType.selectedOrgType || { ORGANIZATION_TYPE: 'Organization Type', ORGANIZATION_TYPE_ID: null };
orgType.selectedOrgType = selectedType;
if (selectedType.ORGANIZATION_TYPE_ID) {
if (vm.registrant.StakeholderOrgs[0])
vm.registrant.StakeholderOrgs[0] = selectedType.ORGANIZATION_TYPE_ID;
else
vm.registrant.StakeholderOrgs.push(selectedType.ORGANIZATION_TYPE_ID);
}
else
vm.registrant.StakeholderOrgs.splice(0);
}
以下一行:
return orgType.selectedOrgType || { ORGANIZATION_TYPE: 'Organization Type', ORGANIZATION_TYPE_ID: null };
抛出无限的摘要循环错误。
让我解释一下我在这里要做的事情。如果有选择,我需要将id推送到列表中。我意识到我可以在某个变量selectedOrgType
上做一个ng-model,然后把我的逻辑放在ng-change中。但是,我试图创建一个不会创建任何不必要的模型变量的下拉列表。相反,我希望将逻辑放在一个getter / setter中,这对我来说更合适。其中一个vm.orgTypes
是{ ORGANIZATION_TYPE: 'Organization Type', ORGANIZATION_TYPE_ID: null }
,我希望这是我的默认值,而不是我得到这个摘要错误,不知道它来自哪里。
答案 0 :(得分:2)
当您添加ng-model
属性时,angular添加内部监视,在每个摘要循环上检查该值,如果值已更改,请再次运行摘要。
在您的情况下,您返回对象文字。在javascript中比较两个文字,即使是相同的结构 - 你得到 false
({a:1} == {a:1}) // false
因为这真的是两个不同的对象。
因此,当您在getter中返回对象文字时,watch
会使用之前的值检查它,并且如上所述,如果您返回文字 - 请 false
所以你得到了无限消化的错误。
为了解决你只需要返回相同的对象。
如果你在数组中有这个对象,比如
vm.orgTypes=[
{ ORGANIZATION_TYPE: 'Organization Type', ORGANIZATION_TYPE_ID: null }
];
所以你只需要直接使用它:
return orgType.selectedOrgType || orgTypes[0];
另一种方式:只需将默认值保存为varible并使用它
var defaultSelect = { ORGANIZATION_TYPE: 'Organization Type', ORGANIZATION_TYPE_ID: null };
....
function orgType(selectedType) {
if (arguments.length == 0)
return orgType.selectedOrgType || defaultSelect;
在这种情况下,您将在默认情况下返回相同的元素,因此请避免无限的摘要掠夺。