我使用密集的 Knockout 绑定与 Durandal/Breeze 开发了一个项目。
我有一个使用以下可观察的视图:
packing
- description
- weight
- ...
- isotopes
- name
- activity
- ...
正如您在上面看到的:我的 observable 内部packing
包含一个isotopes
observableArray。这个packing
对象是用一个查询从微风中填充的。
var query = entityQuery.from('Packings')
.where('id', '==', packingId)
.expand('isotopes');
我尝试使用ko.validation为所有这些设置验证。
我的observable的
description
属性是必需的packing
我的observableArray的
name
属性是必需的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
我的isotopes
observableArray 的属性。因此,每当用户清除绑定到的输入字段时name
,此字段都会以红色突出显示。有用。但问题是每当用户添加一个新的空实体(微风)类型isotope
时,不要在name
输入框中输入任何内容并单击保存,这个没有以红色突出显示。
当我调试和检查值时,我可以清楚地看到:
ko.validation.group(packing(), {deep:false});
没有返回任何无效的东西ko.validation.group(packing().isotopes(), {deep:false});
没有返回任何无效的东西
所以似乎 ko.validation 没有检测到我的无效输入。
我的问题:当我在里面添加一个新元素时如何验证我的嵌套isotopes
observableArray?
谢谢。
更新
这是另一个有问题的 SO 帖子:Breeze.js & Knockout.js:将微风验证转换为敲除验证会导致“堆栈空间不足”或“递归过多”
这是我的“肮脏”和临时黑客(从第 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;
}
仍在等待更好的方法来验证我的内部(嵌套)模型。