我使用密集的Knockout绑定开发了一个带有Durandal / Breeze的项目。
我有一个使用以下observable的视图:
packing
- description
- weight
- ...
- isotopes
- name
- activity
- ...
如上所示:我的packing
observable里面包含一个isotopes
observableArray。这个packing
对象是通过查询填充的。
var query = entityQuery.from('Packings')
.where('id', '==', packingId)
.expand('isotopes');
我尝试使用 ko.validation 为所有这些设置验证。
我description
可观察的packing
属性是必需的
我的name
observableArray的isotopes
属性是必需的
我成功验证了描述。因此,每当用户清除绑定到description
的输入字段时,此字段将以红色突出显示。每当用户添加一个新的空实体(微风)并点击保存时,这个实体都会以红色突出显示。
这要归功于保存按钮中的以下代码:
var validationErrorsCount = ko.computed(function () {
if (typeof packing() == 'undefined') return;
var validationErrors = ko.validation.group(packing());
return validationErrors().length;
})
if (validationErrorsCount() > 0) {
logError('Validation failed, please check.', '', true);
ko.validation.group(packing()).showAllMessages();
return;
}
到目前为止一切顺利。
现在我需要为name
observableArray验证属性isotopes
。因此,每当用户清除绑定到name
的输入字段时,此字段将以红色突出显示。有用。但问题是每当用户添加isotope
类型的新空实体(breeze)时,不要为name
输入框键入任何内容并单击“保存”,这一个未以红色突出显示。
当我调试和检查值时,我可以清楚地看到:
ko.validation.group(packing(), {deep:false});
没有返回任何无效的内容
ko.validation.group(packing().isotopes(), {deep:false});
没有返回任何无效的内容
所以ko.validation似乎没有检测到我的无效输入。
我的问题:当我在里面添加一个新元素时,如何验证我的嵌套isotopes
observableArray?
感谢。
更新
这是我的'脏'&临时黑客(从第4行到第9行)
// Check errors on the packing entity
var validationErrorsCount = ko.validation.group(packing()).length;
// Check errors on the isotopes entities !! code below is a temporary hack
ko.utils.arrayForEach(packing().isotopes(), function (isotope) {
if (!isotope.name.isValid()) {
validationErrorsCount = validationErrorsCount + 1;
ko.validation.group(isotope).showAllMessages();
}
});
if (validationErrorsCount > 0) {
logError('Validation failed, please check.', '', true);
ko.validation.group(packing()).showAllMessages();
return;
}
仍然在等待验证我的内部(嵌套)模型的更好方法。
答案 0 :(得分:1)
我认为没有一种简单的方法。在某种程度的复杂性下,移动到“ItemViewModel”更容易。 ItemViewModel是一个围绕内部实体的面向视图的包装器。它暴露了精心控制的属性,旨在更容易绑定。我described the approach here与另一个问题有关。
我不知道你是不是撞墙了。
另一个想法:为此EntityType写一些custom validations来完成检查同位素的艰苦工作。您将知道如何在验证方法中“正确”并有效地完成工作;你不会依靠KO走图或遇到圆形问题。
答案 1 :(得分:1)
如果您更改了以下内容:ko.validation.group(packing().isotopes(), { deep:false });
至:ko.validation.group(packing().isotopes(), { deep:true });
这不是深点吗?