Пользовательская привязка Knockout не обновляет вычисленную функцию

0

У меня есть настраиваемая привязка для редактируемого поля html.

Я изменил его, чтобы использовать другое пользовательское связывание (HtmlValue), потому что EditableText имел ошибку при обновлении значений (оба пользовательских привязки включены в jsfiddle).

Кто-нибудь знает, как это исправить?

Это код, который не обновляет значение:

ko.bindingHandlers.htmlValue = {
init: function (element, valueAccessor, allBindingsAccessor) {
    ko.utils.registerEventHandler(element, "keyup", function () {
        var modelValue = valueAccessor();
        var elementValue = element.innerHTML;
        if (ko.isWriteableObservable(modelValue)) {
            modelValue(elementValue);

        }
        else { //handle non-observable one-way binding
            var allBindings = allBindingsAccessor();
            if (allBindings['_ko_property_writers'] && allBindings['_ko_property_writers'].htmlValue) allBindings['_ko_property_writers'].htmlValue(elementValue);
        }
    }
                                 )
},
update: function (element, valueAccessor) {
    var value = ko.utils.unwrapObservable(valueAccessor()) || "";
    if (element.innerHTML !== value) {
        element.innerHTML = value;
    }
}
}; 

Вы можете попробовать его здесь: http://jsfiddle.net/DMf8r/

Теги:
knockout.js

1 ответ

1
Лучший ответ

Существует множество проблем с тем, как построена модель представления и с самими привязками...

  • tax_total должен быть объявлен после lines потому что он обращается к lines а Knockout выполняет tax_total как только будет создан tax_total.
  • this должно быть передано в вычисленная таким образом, что this внутри вычисленная является модель представления
  • elem необходимо определить в $.each()
  • Чтобы закодировать базовый массив в $.each(), вам нужно использовать this.lines() вместо this.lines
  • Значения внутри строк должны быть наблюдаемыми, иначе вычисляемые не будут уведомлены об изменениях.
  • Пробел использует привязку value, это должен быть text.

Там, возможно, было больше проблем, но было сложно отслеживать, что все изменения были...

this.lines = ko.observableArray([
    {  unit_price: ko.observable(5.0), tax_rate: ko.observable(21.00) },
    {  unit_price: ko.observable(5.0), tax_rate: ko.observable(21.00) }]);

this.add_line = function () {
    this.lines.push({ unit_price: ko.observable(5.0), tax_rate: ko.observable(21.00) });
}.bind(this);

this.tax_total = ko.computed(function () {
    var total = 0; //this.subtotal()
    $.each(this.lines(), function (index, elem) {
        total += (elem.unit_price() * (elem.tax_rate() / 100));
    });
    return total;
}, this);

<span data-bind="text: tax_total">1.02</span>

Сценарий: http://jsfiddle.net/DMf8r/1/

  • 0
    Значения внутри строк должны быть наблюдаемыми, иначе вычисленное не будет уведомлено об изменениях - это проблема, которую я искал, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню