У меня есть настраиваемая привязка для редактируемого поля 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/
Существует множество проблем с тем, как построена модель представления и с самими привязками...
tax_total
должен быть объявлен после lines
потому что он обращается к lines
а Knockout выполняет tax_total
как только будет создан tax_total
.this
должно быть передано в вычисленная таким образом, что this
внутри вычисленная является модель представления$.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/