我有一个输入元素绑定到一个可以观察到的敲除:
<input type="text" data-bind="value: myText, valueUpdate: 'keyup'" />
这会更新每个keyup上的observable。我现在想要在值更改时触发其他事件。
以下原则上这样做:
this.myTextTrigger = ko.computed( function () {
console.log( this.myText() );
}, this );
然而,它似乎有点笨重。它还会在模板的初始实例化时触发,我只想在此之后处理更改。 是否有一种官方/更简单的方法可以根据对可观察量的变化触发事件?
答案 0 :(得分:40)
使用subscribe:
this.myText.subscribe(function (newText) {
console.log(newText);
});
如果您想重复使用此触发器,可以考虑编写custom binding。
答案 1 :(得分:3)
如果您尝试在绑定中获取额外信息,请使用allBindings.get(
nameOfOtherBinding
)
并设置 nameOfOtherBinding
< / strong>参数,用于引用该元素中指向函数的绑定名称。将函数文字放在HTML中或确保您可以在处理程序定义的范围内找到该函数(例如全局附加到window
对象)。
http://knockoutjs.com/documentation/custom-bindings.html
JS Fiddle Example - http://jsfiddle.net/pqb4xubg/
设置处理程序的javascript(在 init 或 update 中):
ko.bindingHandlers.generic = {
init: function(element, valueAccessor, allBindings){
var val = 'nothing';
// set your other bindings to get pulled in
var func = allBindings.get('func');
// normal check if the binding is actually a function
if(typeof func === 'function'){
// use the retrieved function
val = func(valueAccessor());
}
element.innerText = val;
}
};
var model = {a:'4', b:5};
ko.applyBindings(model);
将使用处理程序的html(注意带有&#34; fun&#34;绑定的元素如何不起作用):
<div data-bind="generic: a, func: function( val ){ return val + 2; }"></div>
<div data-bind="generic: a, fun: function( val ){ return val + 2; }"></div>
<div data-bind="text: a"></div>
<div data-bind="generic: b, func: function( val ){ return val + 2; }"></div>
<div data-bind="generic: b, fun: function( val ){ return val + 2; }"></div>
<div data-bind="text: b"></div>
您也可以使用bind的init来设置标准DOM事件处理程序,并使用jQuery等显式调用这些函数。谢谢。美好的一天。