使用getterSetter从ng-model中获取无限摘要循环

angular infinite digest loop from ng-model using getterSetter

本文关键字:无限 循环 获取 getterSetter ng-model 使用      更新时间:2023-09-26

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模型然后把我的逻辑放到一个ng变化中。然而,我试图使下拉,不创建任何不必要的模型变量。相反,我希望把逻辑放在getter/setter中,这对我来说更合适。其中一个vm.orgTypes{ ORGANIZATION_TYPE: 'Organization Type', ORGANIZATION_TYPE_ID: null },我希望这将是我的默认值,而不是我得到这个摘要错误,不明白它是从哪里来的

当您添加ng-model属性时,angular添加内部监视,检查每个digest循环的值,如果值更改-再次运行digest

在这种情况下,返回对象字面量。在javascript中,当你比较两个字面值时,即使是相同的结构,也会得到false

({a:1} == {a:1}) // false

因为这确实是两个不同的对象。

所以,当你在getter中返回object literal时,watch用前一个值检查它,并且,正如我上面所说,如果你返回literal - get false

所以你得到了无限摘要的错误。

你只需要返回相同的对象。

如果数组中有这个对象,比如

vm.orgTypes=[
    { ORGANIZATION_TYPE: 'Organization Type', ORGANIZATION_TYPE_ID: null }
];

所以你只需要直接使用它:

 return orgType.selectedOrgType || orgTypes[0];

还有另一种方法:只需保存默认值到变量并使用它

var defaultSelect = { ORGANIZATION_TYPE: 'Organization Type', ORGANIZATION_TYPE_ID: null };
....
function orgType(selectedType) {
    if (arguments.length == 0)
        return orgType.selectedOrgType || defaultSelect;

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