2013-11-21 70 views
4

突然間,下面的代碼在定位KnockoutJS 3.0時不再起作用。我該如何解決這個問題?自定義綁定不再適用於KnockoutJS 3.0

Javscript:

ko.bindingHandlers.limitCharacters = { 
    update: function(element, valueAccessor, allBindingsAccessor, viewModel) 
    { 
     element.value = element.value.substr(0, valueAccessor()); 
     allBindingsAccessor().value(element.value.substr(0, valueAccessor())); 
    } 
}; 

HTML:

<textarea data-bind="value: comment, valueUpdate: 'afterkeydown', limitCharacters: 20"></textarea> 

見琴:http://jsfiddle.net/ReQrz/1/

+1

也許在您的瀏覽器中存在問題?在我的FF 25.0.1和GC 31.0中,它非常完美。 – alexmac

+0

有時我們將自定義綁定處理程序放在單獨的腳本中。考慮在文檔準備就緒時運行它們。如果使用jQuery – Daniel

+0

Alexander,試試用$(function(){})封閉它 - 它限制了文本並停止在最大值? –

回答

1

nemesv是完全正確。

他的修改簡短易讀。但是,其中一個缺點是當可見度超過限制時會被調用兩次。

如果你不想這樣做,一個解決方案是創建一個自定義的價值活頁夾來源於原件。

(function() { 
    var limitValueBindingHandler = {}; 

    var valueBindingHandler = ko.bindingHandlers.value; 
    for(var attr in valueBindingHandler) { 
     if (valueBindingHandler.hasOwnProperty(attr)) { 
      limitValueBindingHandler[attr] = valueBindingHandler[attr]; 
     } 
    } 

    limitValueBindingHandler.init = function(element, valueAccessor, allBindings) { 
     var limitCharacters = allBindings.get("limitCharacters"); 

     element.addEventListener("keydown", function() { 
      setTimeout(function() { 
       //this is called after the element's value is updated 
       //but before value binding event handler 
       element.value = element.value.substr(0, limitCharacters); 
      }, 0); 
     }, false); 

     valueBindingHandler.init(element, valueAccessor, allBindings); 
    } 

    ko.bindingHandlers['limitValue'] = limitValueBindingHandler; 
})(); 

樣品:http://jsfiddle.net/DAFN6/

6

在KO 3.0的綁定獨立和有序。你可以閱讀更多關於這個here,這應該被認爲是「重大更改」,從上面的鏈接例子:

V2.X的約綁定之間的依賴關係(在 節關於「獨立,並下令描述的行爲綁定「),是一個 無證內部實現細節所以希望你不是 依靠它。但是,如果你依賴於那麼顯然你會看到 行爲的變化,因爲綁定在v3中是獨立的,由 設計。您需要停止依賴於交叉綁定依賴關係, 順便說一句,這將使您的代碼更清晰,更易於理解 。

所以你綁定,因爲它假定沒有工作了,當你comment屬性更改也激發你的limitCharacters暴食altough您limitCharacters結合無關與comment財產。用於固定這一點,你需要用allBindingsAccessor().value(); acessing其值顯式聲明的value依賴於你的update處理器結合

一個可能的解決方案:

ko.bindingHandlers.limitCharacters = { 
    update: function(element, valueAccessor, allBindingsAccessor, viewModel) 
    { 
     var val = allBindingsAccessor().value();  
     allBindingsAccessor().value(val.substr(0, valueAccessor())); 
    } 
}; 

演示JSFiddle

+0

+2;我也讓我的朋友給它+1,這是非常及時和有用的。 :) –

相關問題