2014-02-23 100 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