2013-05-29 34 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

關於擴展器,合理的迭代它們。 –

相關問題