我还没有成功地让销毁策略在任何兄弟属性或兄弟对象上工作。它只适用于兄弟数组的对象。请检查这个例子:
$scope.schema = {
"type": "object",
"properties": {
"propertyOne": {
"type": "string",
"enum": ["option1", "option2"],
"title": "Property One Select"
},
"propertyTwo": {
"type": "string",
"enum": ["option3", "option4"],
"title": "Property Two Select"
},
"objectOne": {
"type": "object",
"properties": {
"objectOnePropertyThree": {
"type": "string",
"enum": ["option5","option6"],
"title": "Property Three Select"
}
}
},
"arrayOfObjects": {
"type": "array",
"items": {
"type": "object",
"properties": {
"arrayObjectPropertyFour": {
"type": "string",
"enum": ["option7","option8"],
"title": "Property Four Select"
}
}
}
}
},
"required": ["propertyOne"]
};
$scope.form = [{
"key": "propertyOne"
}, {
"key": "propertyTwo",
"condition": "model.propertyOne === "option1""
},{
"key": "objectOne.objectOnePropertyThree",
"condition": "model.propertyOne === "option1""
},{
"key": "arrayOfObjects",
"condition": "model.propertyOne === "option1""
},
{
"type": "submit",
"title": "Save"
}];
http://jsfiddle.net/mutharasus/dp18a70b/在这里,如果你选择第一个下拉菜单为"Option1",然后选择所有其他下拉菜单并保存。然后返回并将第一个下拉菜单切换到"Option2"并保存,您可以看到只有最后一个对象数组被destroy策略删除。
我做错了什么,还是这是一个bug在角模式形式?我查看了github项目中当前开放的问题,我没有看到关于此的开放问题。
你是对的,当一个单独的字段由于条件从视图中删除时,它目前的行为方式不是你所期望的。
事情是这样的:在ASF的"旧的"捆绑装饰器下,每个字段类型的装饰器都在一个外部标签中呈现在页面上。然后处理和呈现适当字段模板的内容。条件逻辑适用于标签内的所有内容,但不适用于标签本身。通常情况下,这是可以的,但是destroyStrategy逻辑被分配给了标签的$destroy事件。最终的结果是,除非从DOM中删除整个标记,否则$destroy事件永远不会触发。这就是对象数组中的模型值被清理的原因——当"模型"被删除时,容器被删除。propertyOne === 'option1'"条件失败,将$destroy事件级联到数组中的每个对象。
我认为随着新构建器的创建和发布,这一点被忽视了,因为我在该功能的PR最后提出了这个问题(https://github.com/Textalk/angular-schema-form/pull/371)。
好的一面是,新的构建器方法(可以通过从https://github.com/Textalk/angular-schema-form-bootstrap添加bootstrap-decorator文件来使用)没有这个问题。相反,destroyStrategy逻辑通过指令应用于表单字段,因为不再使用标记。除非你在这个时候需要和旧的装饰师呆在一起,否则我建议你找一些新的来试一试。
让我们知道进展如何!