我有一个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/
答案 0 :(得分:1)
视图模型的构建方式和绑定本身存在很多问题......
tax_total
计算应该在lines
之后声明,因为它会在创建计算后立即访问lines
并且Knockout会执行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>