2013-05-29 33 views
0

有没有一种方法来设置一个全局配置在KnockoutJS一个ViewModel?Knockout JS。将扩展器应用于ViewModel中的所有可观察对象?

两种可能使用情况可能是:

放眼淘汰赛验证插件源,我看到创建validatedObservable()的时候,它真的把所有的子场为一个observableArray()它然后遍历并应用obj.extend({ validatable: true });。创建这样一个循环是最好的方式?是唯一的其他替代书写代码,如self.firstName = ko.observable().trimmed()

  • 全局地将defaultEvent从“change”更改为“afterkeydown”。

我看到我可以使用<input data-bind="value: name, valueUpdate: 'afterkeydown'" />,但是有没有一种方法可以通过编程或默认方式将它应用于每个输入?是仍是首选的解决方案:How can I get Knockout JS to data-bind on keypress instead of lost-focus?

  • 最后,有火在变化和按键事件的另一种方式?

谢谢!

回答

1

在要处理多个事件,这将是最好使用自定义绑定:

JSFIDDLE

ko.bindingHandlers.onChange = { 
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
     // This will be called when the binding is first applied to an element 
     // Set up any initial state, event handlers, etc. here 
     var value = valueAccessor(); 
     var el = $(element); 
     el.on({ 
      change: function() { 
       value(el.val()); 
      }, 
      keyup: function() { 
       value(el.val()); 
      } 
     }); 
    }, 
    update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
     // This will be called once when the binding is first applied to an element, 
     // and again whenever the associated observable changes value. 
     // Update the DOM element based on the supplied values here. 
    } 
}; 

var model = { 
    name: ko.observable('John') 
}; 

ko.applyBindings(model); 

HTML:

<input type="text" data-bind="onChange: name, value: name" /> 
<div data-bind="text: name"></div> 
+0

大。这很有道理,谢谢。至于将扩展器应用于多个observable,我最好创建,然后遍历observableArray? – lyma

+0

关于扩展器,合理的迭代它们。 –

相关问题