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