gpt4 book ai didi

knockout.js - 根据条件验证observableArray

转载 作者:行者123 更新时间:2023-12-04 18:11:14 25 4
gpt4 key购买 nike

我正在尝试进行实验,看看是否有任何聪明的解决方案来创建可抽象化的整洁和重用的自定义验证器。

在下面的jsfiddle中,我只是构建了一个简单的父模型,该模型存储和存储测量值数组(只是一个值和一个日期)。在此示例中,我提出了两个要求。

  • 每个度量要么都提供了两个字段,要么都没有提供。
  • 必须至少有一个有效的(符合先前条件)度量
    在父数组中。

    理想情况下,我希望定义内容有效的验证逻辑存储在Measurement对象中,如下所示。但是,令我非常震惊的是我必须在atLeastOne()的父模型中执行的“动手”验证。

  • knockout validation 将自动验证数字和日期的各个字段,但我必须介入并对照数组规则执行验证。

    问题:是否有任何方法可以让我设置KO验证以检查此阵列是否符合此所需条件,同时仍使 HasValues方法仍位于测量模型中?即,我想将搜索“至少一个”的概念抽象到某种定制的验证程序中,该验证程序可以为我处理工作,然后告诉此验证程序“嘿,这是我要您用来验证的功能数组中的每个项目。”

    提前致谢!
        function Model(data) 
    {
    var self = this;
    self.Measurements = ko.observableArray();

    for(var i = 0; i < data.length; i++)
    self.Measurements.push(new Measurement(data[i]));

    function hasAtLeastOne(){
    var atLeastOne = false;
    $.each(self.Measurements(), function(i, item) {
    if (item.HasValues()) {
    atLeastOne = true;
    return;
    }
    });
    return atLeastOne;
    }

    self.Save = function() {
    if (self.canSave() && atLeastOne())
    alert('save');
    else
    alert('arg!');
    };

    self.errors = ko.validation.group(self);
    self.canSave = ko.computed(function() {
    return self.errors().length == 0;
    });
    }

    function Measurement(data)
    {
    var self = this;
    self.Value = ko.observable(data.val);
    self.Date = ko.observable(data.date);

    self.Value.extend({ required: { onlyIf: isRequired }, number: true });
    self.Date.extend({ required: { onlyIf: isRequired }, date: true });

    self.HasValues = function() {
    return ko.utils.isNotNullUndefOrEmpty(self.Value()) &&
    self.Date() && self.Date().length > 0;
    };

    function isRequired() {
    return ko.utils.isNotNullUndefOrEmpty(self.Value()) ||
    (self.Date() && self.Date().length > 0);
    }
    }

    ko.utils.isNotNullUndefOrEmpty = function (value) {
    return (typeof value === 'string' && value.length > 0) ||
    (typeof value !== 'string' && value);
    };

    这是一个使用我的示例的jsfiddle:
    http://jsfiddle.net/cACZ9/

    最佳答案

    我一直在研究库资源,以查看是否可以找到可行的选择。这是我到目前为止发现的。

    两种都有优点/缺点的选项(当然):

    使用自定义验证程序:

     ko.validation.rules['AtLeastOne'] = {
    validator: function (array, predicate) {
    var self = this;
    self.predicate = predicate;
    return ko.utils.arrayFirst(array, function (item) {
    return self.predicate.call(item);
    }) != null;
    },
    message: 'The array must contain at least one valid element.'
    };


    function Modal() {
    var self = this;
    self.Measurements = ko.observableArray().extend({ AtLeastOne: function () {
    return this && this.HasValues();
    }

    ...//refer to OP
    ...
    ...

    self.Save() = function() {
    if (self.errors().length == 0)
    alert('Everything is valid, we can save!');
    else if (!self.Measurements.isValid())
    alert('You must have at least one valid item in the pot!');
    };
    });

    这种方法几乎不需要程序员进行验证,并且非常可重用。但是,我注意到一个潜在的缺点是,每当存储在数组中的任何值(对象或其他对象)发生突变时,它将调用自定义验证规则。对于大多数人来说可能不是问题。

    使用验证器工厂:
     var KoValidationFactory = {
    AtLeastOne: function (measurements, validator) {
    return function () {
    var self = this;
    self.validator = validator;
    return ko.utils.arrayFirst(measurements, function (measurement) {
    return self.validator.call(measurement);
    }) != null;
    };
    }

    };

    function Modal() {
    var self = this;
    self.Measurements = ko.observableArray();

    ...//refer to OP
    ...
    ...

    self.Save = function () {
    var atLeastOneArrayValidator = KoValidationFactory.AtLeastOne(self.Measurements(), function () {
    return this && this.HasValues();
    });
    var arrayWasValid = atLeastOneArrayValidator();
    if (arrayWasValid && self.errors() == 0)
    alert('everything is good, we can save');
    else if (!arrayWasValid)
    alert('You must have at least one item in the pot!');
    };
    }

    这种方法可以确保仅当您明确选择验证整个阵列时,才对整个阵列进行验证。不利的一面是您需要动手做更多的工作,并且没有充分利用 knockout 验证库的优势。您必须特别验证数组和采用此方法的所有/所有其他可观察对象,如果其中有很多观察对象,则可能会变得困惑。

    我鼓励对这些方法进行编辑和提出建议。

    关于knockout.js - 根据条件验证observableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13610769/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com