【问题标题】:how to use knockout validation如何使用淘汰赛验证
【发布时间】:2015-02-01 01:42:33
【问题描述】:

我正在关注这个link 来创建验证。

但我不明白如何在我的代码中使用这个 extend 方法。

我将来自调用微风查询的记录加载到我的 observable 中。

我以以下方式加载数据

dataObsArray= ko.observableArray()

datacontext.getData(id,dataObsArray)
                   .then(function () {

          // some logic


 })
        .fail("Data not found");

然后我将这个 obs 数组绑定到我的视图,如下所示

<tbody data-bind="with: dataObsArraay">
            <tr>
                <td>name</td>
                <td> <input data-bind="  value: Name" ></td>
                <td> <input data-bind="  value: Age" ></td>

            </tr>
</tbody>

所以我不明白如何使用 extend 方法,因为我只是将视图与可观察数组中的属性绑定。

请指导我。

【问题讨论】:

  • 在您的视图模型中,您是否具有实体功能,即名称、年龄等。如果你需要使用.extend({//logic here})
  • 我可以帮助您以淘汰赛的方式发布一些答案,但我对微风一无所知

标签: javascript knockout.js breeze knockout-validation


【解决方案1】:

考虑使用breeze validation,而不是通过淘汰扩展器将验证逻辑放入 UI 代码中。使用轻而易举的验证将确保始终评估规则,并使您无需为验证目的在实体上创建额外的模型。

这里有一个例子,使用了一个轻量级的内置验证器:stringLength 验证器。

var entityType = entityManager.metadataStore.getEntityType('????'),
    nameProperty = entityType.getProperty('Name'),
    nameLengthValidator = breeze.Validator.stringLength({ maxLength: 10, minLength: 2 });
nameProperty.validators.push(nameLengthValidator);

下面是一个自定义必需验证器的示例,该验证器用于不允许纯空格值的字符串:

// make a reusable validator
var myRequiredValidator = breeze.Validator.makeRegExpValidator(
    "myRequiredValidator",  
    /\S/,  
    "The %displayName% '%value%' cannot be blank or entirely whitespace");

// register it with the breeze Validator class.
breeze.Validator.register(myRequiredValidator);

// add the validator to the Name property...
var entityType = entityManager.metadataStore.getEntityType('????'),
    nameProperty = entityType.getProperty('Name');
nameProperty.validators.push(nameLengthValidator);

这是用于制作正则表达式验证器的documentation

您还可以编写自定义验证器——查看breeze docs 了解更多信息——查找编写自定义验证器部分。

【讨论】:

  • 如果我在输入框中使用空间,我会使用什么样的验证?我把 [Required] 属性放在我的实体上,但是当我尝试保存时,我得到 entityAspect.hasValidationErrors 为假。我不希望用户只有空格
  • 我不想在我的字符串中只允许空格.. 我也在我的实体上试过这个 [Required(AllowEmptyStrings = false)]
  • 我正试图将它直接放在我的实体上。像这样 [必需] [Column(TitleCol, TypeName = "varchar")] [MaxLength(1000)] public virtual string Description { get;放; }
  • 换句话说,您希望轻而易举地尊重与验证相关的 .NET 数据注释。在某些情况下确实如此,在其他情况下,您需要补充微风元数据并添加您自己的自定义验证。查看此问题以获取更多信息:stackoverflow.com/q/26570638/725866
【解决方案2】:

您需要为您的数据创建一个模型,例如:

function person(name, age) {
    this.name = ko.observable(name).extend({ minLength: 2, maxLength: 10 });
    this.age = ko.observable(age).extend({ min: 18, max: 99 });
}

var data = [],
    people = ko.observableArray();

datacontext.getData(id, data)
    .then(function (data) {
        for (i = 0; i < data.length; i++) {
            people.push(new person(data.Name, data.Age));
        }
    })
    .fail("Data not found");


<tbody data-bind="foreach: people">
    <tr>
        <td>name</td>
        <td> <input data-bind="  value: name" ></td>
        <td> <input data-bind="  value: age" ></td>
    </tr>
</tbody>

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 2012-11-04
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2012-12-05
    • 2012-03-08
    相关资源
    最近更新 更多