2013-11-21 26 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,这是非常及时和有用的。 :) –

相关问题