2014-02-23 103 views
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/

回答

1

没有与方式的一堆问题,构建视图模型和与绑定本身...

  • tax_total计算应lines后声明,因为它访问lines并且在计算创建后立即执行tax_total
  • this需要被传递到计算使得this计算内部是视图模型
  • ELEM需要在$.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

内部线的值需要是可观察的,否则计算不会被通知变化是我寻找的问题,thx! – NicoJuicy