简体   繁体   English

淘汰赛已验证可观察的数据绑定未按预期工作

[英]Knockout validatedObservable data-bind not working as expected

I'm trying to data-bind to a validatedObservable but the control does not seem updatable as other knockout observables. 我正在尝试将数据绑定到validatedObservable,但该控件似乎不像其他敲除的Observable一样可更新。

Fiddle here, http://jsfiddle.net/EricHerlitz/x7UUg/ 在这里提琴, http://jsfiddle.net/EricHerlitz/x7UUg/

Short explanation 简短说明

// variable with the data bound observable
that.validationErrors = ko.validatedObservable();

// Elements to validate
var validationGroup = {
    email1: that.email1,
    firstName: that.firstName
};

// Trying to use the validatedObservable in a normal knockout way doesn't work
that.validationErrors(validationGroup);

// This will fill the variable with the observable result but as usual when performing this pattern the viewmodel must be rebound.
that.validationErrors = ko.validatedObservable(validationGroup);

Source 资源

<h3>Registrering</h3>
<div class="form-group">
    <label for="Email1">E-postadress</label>
    <input data-bind="value: email1" id="Email1" class="form-control" placeholder="E-postadress (du kommer få lösenords-länk skickad hit)" />
</div>
<div class="form-group">
    <label for="Firstname">Förnamn</label>
    <input data-bind="value: firstName" id="Firstname" class="form-control" placeholder="Förnamn" />
</div>

<button type="button" class="btn btn-primary" data-bind="click: registerClick">Registrera</button>

<div class="alert alert-danger" data-bind="visible: !validationErrors.isValid()">
    <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
    <h4>There be dragons!</h4>
    <div data-bind="foreach: validationErrors.errors">
        <div data-bind="text: $data"></div>
    </div>
</div>

Js JS

var GK = GK || {};
GK.VM = GK.VM || {};

GK.VM.Member = function (template) {
    /*** Private variables ***/
    var that = this;

    /*** Public variables ***/
    that.validationErrors = ko.validatedObservable();

    // variables with validation, https://github.com/Knockout-Contrib/Knockout-Validation
    that.email1 = ko.observable().extend({
        required: { params: true, message: "missingEmail" },
        pattern: { params: /^([\d\w-\.]+@([\d\w-]+\.)+[\w]{2,4})?$/, message: "wrongEmailFormat" }
    });
    that.firstName = ko.observable().extend({
        required: { params: true, message: "missingFirstName" }
    });

    that.registerClick = function () {

        // Elements to validate
        var validationGroup = {
            email1: that.email1,
            firstName: that.firstName
        };

        // This would be ideal but doesn't work
        //that.validationErrors(validationGroup);
        //console.log(that.validationErrors.errors()); // does not contain any erros

        // This will destroy the data-bind but register the validatedObservable
        // Requires rebinding of the control :(
        that.validationErrors = ko.validatedObservable(validationGroup);
        console.log(that.validationErrors.errors()); // contains errors
    };
};

var viewModel = new GK.VM.Member();
ko.applyBindings(viewModel);

Any advice how to deal with this? 有什么建议如何处理吗? Thanks. 谢谢。

Current you cannot update a validatedObservable after it has been created without re-creating it completely. 当前,您无法在没有完全重新创建validatedObservable之后对其进行更新。

However if you don't need this dynamic aspect of adding removing properties to it but you just need to show the collected validation messages based on criteria (when the registerClick is called) then there are alternative solutions. 但是,如果您不需要向其中添加删除属性的动态方面,而只需要根据条件(在调用registerClick时)显示收集的验证消息,则可以找到其他解决方案。

One solution would be to create the validatedObservable normally: 一种解决方案是正常创建validatedObservable

that.validationErrors = ko.validatedObservable({
    email1: that.email1,
    firstName: that.firstName
});

Then add a new observable: 然后添加一个新的observable:

that.showErrorMessages = ko.observable();

and use that in the UI 并在用户界面中使用

<div class="alert alert-danger" 
    data-bind="visible: showErrorMessages() && !validationErrors.isValid()">

and in the registerClick to toggle when the validation messages should be shown: 并在registerClick中切换显示验证消息的时间:

that.registerClick = function () {
    that.showErrorMessages(true);
};

Demo JSFiddle . 演示JSFiddle

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM