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>
Шаги для воссоздания проблемы:
- Пользователь переходит в поле ввода nickName и удаляет содержимое.
dirty
и кнопка "Сохранить" включена. - Пользователь нажимает кнопку Сохранить. Изменение сохраняется, и кнопка "Сохранить" становится недоступной.
- Пользователь переходит на emailAddress и удаляет контент.
dirty
НЕ поднимается как-то. Пользователь не может сохранить изменения. - Пользователь вводит что-то на 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
,