【问题标题】:How to validate that a set of numbers across multiple models objects adds up to a specified value?如何验证跨多个模型对象的一组数字加起来是否达到指定值?
【发布时间】:2013-06-26 11:10:58
【问题描述】:

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

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

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

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

例如,ObjA.Heading 如果是正数则有效,and ObjB.Heading 也是正数;反之亦然(ObjB.Heading 为正数时有效, ObjA.Heading 也为正数)。

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

谢谢!

【问题讨论】:

  • 这正是我第一次运行时的处理方式。如果您考虑显示,您可能会有一个“总计”行,它将所有内容相加。您将验证进行计算的“总计”视图模型,而不是其他视图模型的集合。听起来对我来说是一种有效的方法!

标签: knockout.js knockout-2.0 durandal knockout-validation


【解决方案1】:

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

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

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

// 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 });

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

【讨论】:

  • 我认为 ko.computed() 应该自动检测依赖的 observable 是否已更改,从而重新计算自己并通知订阅者新值?
  • 你知道,你是对的。我曾将这种方法用于一个单独的问题,并使用 pub/sub 实现来执行此操作,但在这种情况下,计算可以执行此操作。在这里尝试了计算方法:jsfiddle.net/8UGLW 我使用 pub/sub 的地方具有需要验证的多个级别的子视图模型,并且每次发生任何更改时都通过验证分组重新运行它是多余的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 2012-03-21
  • 2012-01-14
相关资源
最近更新 更多