0

我正在使用Knockout Validation在 Durandal/KnockoutJS 应用程序中验证我的模型。它工作正常,但我遇到了我不知道如何处理的情况。用户输入的内容之一是“讲师”列表,他们可以输入任意数量的讲师。每个讲师都有一个“教学百分比”值。所有教学百分比的总和必须达到 100%。

我不确定如何为此设置验证,因为当我为“Instructors”定义模型对象时,我无法引用任意数量的其他 Instructor 对象。

我能想到的最好的选择是放置一个 viewmodel 计算 observable ,它是所有教师教学百分比的总和,并将该值验证为 100。

我错过了什么吗?这是解决这种情况的明智方法吗?从广义上讲,这个问题适用于您有多个模型对象的任何情况,并且它们的一个属性的有效性相互依赖于其他对象的属性。

例如,ObjA.Heading 为正数时有效,ObjB.Heading 也为正;反之亦然(ObjB.Heading 为正数有效,ObjA.Heading 也为正数

感谢您就如何处理这种情况提供任何意见。

谢谢!

4

1 回答 1

0

最初回复了第一条评论,但我认为它更多地属于答案类别:

棘手的部分是您的总和/总计算可观察量如何知道子视图模型“教学百分比”值实际上已经改变?每当将讲师添加/删除到列表中时触发计算是一回事,但是修改现有讲师的值需要一些额外的工作。在这种情况下,我建议查看knockout-postbox。它是一个 pub/sub 类型库,您的主 VM 可以在其中订阅其他视图模型 observable 中发生的更改。从那里你的计算可以根据这些变化进行更新

不确切知道您的视图模型的外观,它会像这样工作:

// in instructor VM
self.teachingPercentage= ko.observable(value).publishOn("teachingPercentageUpdated");

// in main VM
self.teachingPercentageTotal = ko.computed(function () {
    var total = 0;
    ko.utils.arrayForEach(self.instructors(), function (i) {
        total += i.teachingPercentage();
    });
    return total;
});
self.teachingPercentageTotal.subscribeTo("teachingPercentageUpdated");
self.teachingPercentageTotal.extend({ equal: 100 });

假设它有效,我实际上并没有运行它。可能有一些更好的方法来做到这一点,但这是一般的想法。

于 2013-06-28T19:50:52.953 回答