Представляет ли проблема подписка на свойство - в knockoutjs - которое создает само себя? - PullRequest
1 голос
/ 09 марта 2011

Я использую knockoutjs для обработки различных событий - одним из них является добавление тысячи разделителей в поле ввода цены.

Итак, я подписываю событие изменения на мое поле цены, и это делает некоторую магию, чтобы добавить недостающие разделители, и записывает его обратно в поле цены. Обратная запись в поле цены запускает новое событие изменения, и поэтому мне нужна проверка, чтобы разорвать цикл - что я делаю, спрашивая, действительно ли значение изменилось:

    this.listingPriceFormatted.subscribe(function (newValue, model) {
        var cleanValue = newValue.toString().replace(/\D/g, '');
        $('#Price').val(cleanValue);
        var outValue = MySite.Utilities.addThousandSeperator(cleanValue);
        if (newValue != outValue) {
            me.listingPriceFormatted(outValue);
        }
    });

Мне не очень нравится запускать одно и то же событие дважды, просто чтобы установить значение один раз. Можно ли как-нибудь записать обратно в поле, не вызывая событие снова, или я все делаю неправильно?

1 Ответ

3 голосов
/ 09 марта 2011

В этом случае связывание с доступным для записи зависимым объектом Observable , вероятно, будет правильным инструментом для работы. Это позволит вам контролировать, как поле считывается и устанавливается.

Например, если у вас есть наблюдаемая переменная listPrice, то у вас может быть доступный для записи listPriceFormatted variableObservable. Вы бы привязали свое поле к списку PriceFormatted. Это будет выглядеть так:

viewModel.listingPriceFormatted = ko.dependentObservable({ 
   read: function() { 
               //add commas
               return MySite.Utilities.addThousandSeperator(this.listingPrice());
          },
   write: function(newValue) {
              //strip commas and store in listingPrice
              this.listingPrice(MySite.Utilities.stripThousandSeperator(newValue));
          }
   }, viewModel);

Эта функциональность была добавлена ​​после 1.12, поэтому вам нужно будет использовать более позднюю копию кода из GitHub. Надеюсь это поможет.

Кроме того, в конце этого поста есть идея для инкапсуляции наблюдаемого и зависимого наблюдаемого в один объект, который может быть вам полезен: http://www.knockmeout.net/2011/03/guard-your-model-accept-or-cancel-edits.html

...