Knockout Validation — проверка не привязывается к правильному экземпляру объекта

Я использую 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. Нажмите «Изменить» в первой строке — вы будете предупреждены о том, что отображается сообщение о проверке, НО оно не отображается (ОШИБКА)

Должен ли я использовать другой подход к этому или я должен сделать что-то другое с тем, как я использую ko.validation.group?


person tcigrand    schedule 15.04.2015    source источник


Ответы (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>
person Jeff Mercado    schedule 15.04.2015
comment
это не сработает так, как вы ожидаете, можете ли вы рассказать об этом подробнее? - person Carrie Kendall; 16.04.2015
comment
Спасибо, это работает. Я упустил из виду, как я связывал этот раздел. - person tcigrand; 16.04.2015
comment
@CarrieKendall: если someObservable изменится, привязка может увидеть или не увидеть это изменение, в зависимости от свойства, к которому вы обращаетесь, и других факторов. Нет никаких гарантий. Я бы просто всегда избегал этого шаблона и использовал что-то более стабильное. - person Jeff Mercado; 16.04.2015
comment
Например, наблюдаемо ли родительское свойство? Ваша текущая формулировка на самом деле не объясняет, почему она просто говорит: «Никогда не делайте x». Не могли бы вы добавить объяснение, чтобы оно меньше походило на вуду? - person Carrie Kendall; 16.04.2015
comment
@CarrieKendall: Честно говоря, это то, что не требует особых объяснений. Есть шаблон того, как что-то должно быть сделано, и есть вещи, которые вполне приемлемы. Но есть вещи, которые нежелательны. Нам не нужно объяснять каждую незначительную деталь. - person Jeff Mercado; 16.04.2015
comment
О, ну, может быть, я единственный, кто предпочел бы больше объяснений :) Я склонен не слепо следовать шаблонам, не понимая, почему под ними. Вы можете отвечать так, как вам нравится, я просто подумал, что это было важным, поскольку кажется, что оно сильно связано с проблемой ОП. - person Carrie Kendall; 16.04.2015
comment
@CarrieKendall нет, я согласен, хорошее объяснение никогда не следует слепо тому, что я говорю - person Loktar; 16.04.2015