【问题标题】:Validating plain observableArray()验证普通的 observableArray()
【发布时间】:2013-09-11 03:30:14
【问题描述】:

假设我的模型非常简单(字符串列表),并且我不想使用深度验证 ko.validation.init( { grouping: { deep: true } } ) 将类型化对象放入 observableArraythen validate it

例如我希望所有数组元素(纯字符串)都符合minLength:3

为什么ko.observable().extend({minLength:3}) 可以,但ko.observableArray().extend({minLength:3}) 不行?

除了将对象(而不是纯字符串)放入数组之外,还有其他解决方法吗?

拨弄start with

【问题讨论】:

    标签: knockout.js knockout-validation


    【解决方案1】:

    好吧,您可以像这样在observableArray 原型上创建minLength 函数:

    ko.observableArray.fn.stringMinLength = function (minLength) {
        var self = this;// observableArray
        // Loop through array and apply logic to each element
        // Add subscriptions to the observableArray to determine what's been added (don't care about what's been removed)
        // In the subscriptions, deal with how to apply the minLength validation
        // -can't use '.extend({ minLength: minLength })' because these are plain strings, not observables
        return self;
    }
    

    现在你可以这样做了:

    var oa = ko.observableArray(["foo", "bar", "bo"]).stringMinLength(3);
    

    问题的症结在于,当oa 的值发生突变时,您希望如何对所有字符串元素应用验证。

    【讨论】:

    • 哦,对于 observableArray 成员的验证规则的简单扩展来说,这太过分了......我最好为我的数组使用人造对象,我可以轻松扩展:ko.observableArray([{value: ko.observable("foo").extend({minLength:3})}, ..., ...])
    • 是的,我可能也会选择这个。您可能会查看映射插件来为您映射数组中的这些对象。或者只是创建一个简单的构造函数,您传入一个字符串和一个 int,它返回一个具有 value 属性的对象,该属性是一个可观察的,其 minLength 设置为您传递的 int。 ko.observableArray([new Item('foo', 3), new Item('bar', 3), new Item('bo', 3), etc... ])。有很多方法可以做同样的事情,这是一种祝福和诅咒。
    猜你喜欢
    • 2012-11-16
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2012-04-24
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多