【问题标题】:Knockout Validation - Validation not binding to correct instance of object淘汰赛验证 - 验证未绑定到正确的对象实例
【发布时间】:2023-03-07 15:39:01
【问题描述】:

我正在使用knockout-validation,但在更改输入字段绑定的可观察对象后,错误消息无法正确显示。

我有以下html

<div id="editSection" data-bind="if: selectedItem">
    <div>
        <label>First Name</label>
        <input data-bind="value:selectedItem().FirstName" />
    </div>
    <div>
        <label>Last Name</label>
        <input data-bind="value:selectedItem().LastName" />
    </div>
</div>

<br/>

<table data-bind='if: gridItems().length > 0'>
    <thead>
        <tr>
            <th>First Name</th>
            <th>Last Name</th>
        </tr>
    </thead>
    <tbody data-bind='foreach: gridItems'>
        <tr>
            <td data-bind='text: FirstName' ></td>
            <td data-bind='text: LastName' ></td>
            <td><a href='#' data-bind='click: $root.editItem'>Edit</a></td>
        </tr>
    </tbody>
</table>

和 JavaScript

var lineViewModel = function(first, last) {
    this.FirstName = ko.observable(first).extend({required:true});
    this.LastName = ko.observable(last).extend({required: true});

    this.errors = ko.validation.group(this);
}

var mainViewModel = function() {
    this.gridItems = ko.observableArray();
    this.gridItems([new lineViewModel('first1'), new lineViewModel(null,'last2')]);

    this.selectedItem = ko.observable();

    this.editItem = function(item){
        if (this.selectedItem()) {
            if (this.selectedItem().errors().length) {
                alert('setting error messages')
                this.selectedItem().errors.showAllMessages(true);
                }
            else{
                this.selectedItem(item)
            }
            }
        else
            this.selectedItem(item)
    }.bind(this)
}

ko.applyBindings(new mainViewModel());

复制

使用这个JSFiddle

  1. 点击第一行的编辑
  2. 单击第二行上的编辑 - 您将收到验证通知 消息正在显示,然后它会显示
  3. 填写必填字段
  4. 再次单击第二行上的编辑 - 您将看到“名字”进入 空白和“姓氏”更改为“last2”
  5. 单击第一行上的编辑 - 您将收到验证通知 正在显示消息,但未显示(BUG)

我应该采取另一种方法,还是应该用我使用 ko.validation.group 的方式做一些不同的事情?

【问题讨论】:

    标签: javascript knockout.js knockout-validation


    【解决方案1】:

    验证很好...您的编辑部分有问题。

    使用with 绑定。永远不要在绑定中使用someObservable().someObservableProperty,它不会像你预期的那样工作。您应该更改绑定上下文。

    <div id="editSection" data-bind="with: selectedItem">
        <div>
            <label>First Name</label>
            <input data-bind="value: FirstName" />
        </div>
        <div>
            <label>Last Name</label>
            <input data-bind="value: LastName" />
        </div>
    </div>
    

    【讨论】:

    • “它不会像你想象的那样工作”你能扩展一下吗?
    • 比如父属性是否可观察?您当前的措辞并没有真正解释为什么它只是说“从不做 x”。你介意添加解释,让它听起来不像巫毒吗?
    • @CarrieKendall:老实说,这种事情真的不需要太多解释。应该如何做事情有一个模式,有些事情是可以接受的。但是,有些事情是不可取的。我们不需要解释每一个无关紧要的细节。
    • 哦,好吧,也许我是唯一一个希望得到更多解释的人 :) 我倾向于不会盲目地遵循模式而不了解背后的原因。您可以随意回答,我只是认为这很重要,因为它似乎与 OP 的问题密切相关
    • @CarrieKendall 不,我同意,一个好的解释绝不是“盲从我所说的”
    猜你喜欢
    • 2016-08-13
    • 2015-07-18
    • 2013-11-14
    • 2012-02-18
    • 1970-01-01
    • 2013-07-01
    • 2012-11-04
    • 1970-01-01
    • 2013-01-14
    相关资源
    最近更新 更多