使用getterSetter从ng-model中获得角度无限消化循环

时间:2015-10-22 18:16:18

标签: javascript angularjs

这是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 },我希望这是我的默认值,而不是我得到这个摘要错误,不知道它来自哪里。

1 个答案:

答案 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;

在这种情况下,您将在默认情况下返回相同的元素,因此请避免无限的摘要掠夺。