ko.validation.group没有在嵌套的observableArray上检测到我的错误

时间:2013-04-24 12:48:41

标签: knockout.js breeze durandal

我使用密集的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?

感谢。


更新

以下是问题的另一个SO帖子:Breeze.js & Knockout.js: translating breeze validation to knockout validation causes an 'Out of stack space' or 'Too much recursion'

这是我的'脏'&临时黑客(从第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;
}

仍然在等待验证我的内部(嵌套)模型的更好方法。

2 个答案:

答案 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 });

这不是深点吗?