PublishOn не срабатывает при удалении входного контента

Я использую knockout-postbox, чтобы пометить грязный флаг. Код выглядит так:

var ProfileModel = function() {
    this.nickName = ko.observable("name1").publishOn("dirty", true);
    this.emailAddress = ko.observable("email1").publishOn("dirty", true);
};

ko.postbox.subscribe("dirty", function(newValue) {
    // enable Save button
}, this);

nickName и emailAddress привязаны к полям ввода.

<div id="profile">
    <input data-bind="value: nickName" /> </label>
    <input data-bind="value: emailAddress" /></label>
</div>

Шаги для воссоздания проблемы:

  1. Пользователь переходит в поле ввода nickName и удаляет содержимое. dirty и кнопка "Сохранить" включена.
  2. Пользователь нажимает кнопку Сохранить. Изменение сохраняется, и кнопка "Сохранить" становится недоступной.
  3. Пользователь переходит на emailAddress и удаляет контент. dirty НЕ поднимается как-то. Пользователь не может сохранить изменения.
  4. Пользователь вводит что-то на emailAddress или nickName. dirty и кнопка "Сохранить" включена.

Вы можете проверить jsfiddle, чтобы увидеть его в действии. В примере jsfiddle нет кнопки Сохранить, но попробуйте удалить содержимое nickName, а затем emailAddress. Вы увидите удаление электронной почты. Адрес не поднимается dirty событие.

Это известная ошибка в нокаут-постбоксе? Есть ли лучший способ проверить грязь в нокауте?

1 ответ

Решение

По умолчанию publishOn функциональность knockout-postbox не будет публиковать последнее значение снова. В вашем примере вы публикуете пустую строку для "dirty" (пустое псевдоним), а затем снова пустую строку (пустое электронное письмо).

publishOn поддерживает передачу в вашем собственном компараторе равенства. В вашем случае вы можете передать функцию, которая всегда возвращает false,

Например, что-то вроде:

var alwaysPublish = function() { return false; }

var ProfileModel = function() {
    this.nickName = ko.observable("Ryan").publishOn("dirty", true, alwaysPublish);
    this.emailAddress = ko.observable("ryan@knockmeout.net").publishOn("dirty", true, alwaysPublish);
    this.log = ko.observableArray();
};

Вот скрипка: http://jsfiddle.net/rniemeyer/qmbwhk8a/

Вы также можете глобально переопределить функцию сравнения, установив ko.postbox.defaultComparer,

Другие вопросы по тегам