2015-01-29 6 views
0

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

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 и адрес электронной почты связаны с полями ввода.

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

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

  1. Пользователь переходит в поле ввода никнейм и удалить содержимое. dirty и кнопка «Сохранить» включена.
  2. Пользователь нажимает кнопку «Сохранить». Изменение сохраняется, и кнопка «Сохранить» становится недоступной.
  3. Пользователь отправляется по электронной почте и удаляет контент. dirty НЕ РЕАЛЬНО. Пользователь не может сохранить изменения.
  4. Пользователь вводит что-то в адрес электронной почтыAddress или nickName. dirty и кнопка «Сохранить» включена.

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

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

+0

Да, я вижу проблему - я подозреваю, что это ошибка в почтовом ящике. Я не использую postbox таким образом, поэтому не могу помочь. Для редактирования/сохранения/отмены взгляните на https://github.com/stevegreatrex/ko.plus - хорошую возможность редактирования/отмены/фиксации. – Quango

ответ

1

По умолчанию функциональность publishOnknockout-postbox не будет публиковать последнее значение снова. В вашем примере вы публикуете пустую строку для «грязного» (пустого псевдонима), а затем пустую строку (пустое письмо).

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

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

var alwaysPublish = function() { return false; } 

var ProfileModel = function() { 
    this.nickName = ko.observable("Ryan").publishOn("dirty", true, alwaysPublish); 
    this.emailAddress = ko.observable("[email protected]").publishOn("dirty", true, alwaysPublish); 
    this.log = ko.observableArray(); 
}; 

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

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

+0

Это решает мою проблему. Спасибо! Тем не менее, один вопрос: не было бы более интуитивным подавлять повторяющиеся значения из одного источника, а не подавлять повторяющиеся значения для одной и той же цели, так как «publishOn» привязан к источнику? – kennethc

+0

@kennethc - да, я мог бы немного приблизиться к одному из изменений, которые нужно будет сделать. Значение кэшируется на уровне темы, так что это то, к чему он сравнивается. Я думаю, что у вас есть полностью допустимый прецедент, который lib не обрабатывает интуитивно. –

Смежные вопросы