当用户输入然后清除输入字段中的文本时,Angular似乎有不同的行为,具体取决于是否需要此字段。
看看这个example。默认情况下,模型为user = {"name":"guest","last":"visitor"}
。清除这两个字段时,模型变为user = {"last":""}
,而我预期user = {}
。
为什么会这样?并且,有没有办法在两个字段中获得相同的行为而不同时(不)需要它们?
更新
我最后使用了手表的解决方法:
$scope.$watch('user',function(newValue) {
for (var prop in newValue) {
if (newValue.hasOwnProperty(prop)){
if (newValue[prop] !== undefined && newValue[prop] == "")
newValue[prop] = undefined;
}
}
}, true);
最有可能的最后一个if条件可以更有效地编写,但至少它似乎按预期工作。
答案 0 :(得分:5)
如果验证错误,the model is set to undefined
因此消失name
密钥(使用required
验证)。
Angular中的一个已知错误是ng-minlength
的空字段无法正确无效。如果您将值设置为a
(仍然是最少3个字母的2个字母),您会发现两个键都正确消失。
答案 1 :(得分:1)
这种情况的产生是因为"用户名:"字段具有required
验证,因此当您清除"用户名:"领域。 "用户名:"字段未通过required
验证。结果,模型变为user = {"last":""}
另一方面,"姓氏:"在明确"姓氏:"之后进行ng-minlength="3"
和ng-maxlength="10"
验证在"姓氏:"上输入1或2个字符时的字段领域。它没有通过minlength
验证,因此模型变为user = {}
所以,如果任何validation
失败,请使用"用户名:"字段,它从模型中消失,模型变为user = {"last":""}
答案 2 :(得分:0)
如果结果是user = {}
,则意味着Angular必须通过调用user.delete('last')来完全delete
该属性,这是不可能的做。它对person
对象一无所知。它只引用了person.last
属性