3

我使用密集的 Knockout 绑定与 Durandal/Breeze 开发了一个项目。

我有一个使用以下可观察的视图:

packing
  - description
  - weight
  - ...
  - isotopes
    - name
    - activity
    - ...

正如您在上面看到的:我的 observable 内部packing包含一个isotopesobservableArray。这个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我的isotopesobservableArray 的属性。因此,每当用户清除绑定到的输入字段时name,此字段都会以红色突出显示。有用。但问题是每当用户添加一个新的空实体(微风)类型isotope时,不要在name输入框中输入任何内容并单击保存,这个没有以红色突出显示。

当我调试和检查值时,我可以清楚地看到:

  • ko.validation.group(packing(), {deep:false});没有返回任何无效的东西

  • ko.validation.group(packing().isotopes(), {deep:false});没有返回任何无效的东西

所以似乎 ko.validation 没有检测到我的无效输入。

我的问题:当我在里面添加一个新元素时如何验证我的嵌套isotopesobservableArray?

谢谢。


更新

这是另一个有问题的 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;
}

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

4

2 回答 2

1

如果你改变:ko.validation.group(packing().isotopes(), { deep:false });

至:ko.validation.group(packing().isotopes(), { deep:true });

这不就是深度吗?

于 2013-06-12T20:17:59.287 回答
1

我不认为有一个简单的方法。在一定程度的复杂性下,移动到“ItemViewModel”会更容易。ItemViewModel 是围绕内部实体的面向视图的包装器。它公开了为更容易绑定而设计的精心控制的属性。我在这里描述了与另一个问题相关的方法。

不知道你有没有撞墙。

另一个想法:为这个 EntityType 编写几个自定义验证来完成检查同位素的艰苦工作。您将知道如何在验证方法中“正确”有效地完成工作;您将不会依赖 KO 来遍历图表或遭受循环问题。

于 2013-04-27T03:13:24.117 回答