Knockout自定义绑定不会更新计算的函数

时间:2014-02-23 21:56:06

标签: javascript jquery knockout.js

我有一个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/

1 个答案:

答案 0 :(得分:1)

视图模型的构建方式和绑定本身存在很多问题......

  • tax_total计算应该在lines之后声明,因为它会在创建计算后立即访问lines并且Knockout会执行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/