Knockout.JS:基于改变触发器中可观察到的

Knockout.JS:基于改变触发器中可观察到的

问题描述:

我有这势必会观察到的敲除的输入元件:Knockout.JS:基于改变触发器中可观察到的

<input type="text" data-bind="value: myText, valueUpdate: 'keyup'" /> 

这更新了可观察到的每个KEYUP。我现在想要在值更改时触发其他事件。

下做到这一点原则:

this.myTextTrigger = ko.computed(function() { 
    console.log(this.myText()); 
}, this); 

然而,似乎有点笨重。它也触发了模板的初始实例,在那里我只想处理更改。 是否有官方/更简单的方法来触发基于观察对象变化的事件?

使用订阅:

this.myText.subscribe(function (newText) { 
    console.log(newText); 
}); 

如果你想重新使用此触发可以考虑书面方式一个custom binding

+2

手动订阅+1(http://knockoutjs.com/documentation/observables.html#explicitly_subscribing_to_observables) –

+0

自定义绑定似乎对单个输入恕我直言,过度杀伤。订阅听起来对我来说是更好的选择。 –

+0

正是我在找的东西。谢谢! - 关于自定义绑定:是否有一种方法可以对更改应该触发其他事件的字段进行通用绑定,并将该函数传递给HTML中的绑定内部执行? – gzost

如果你想在你的绑定,然后使用allBindings.get(nameOfOtherBinding)并设置nameOfOtherBinding参数是指在指向一个功能元素的绑定名称来获得额外的信息。将函数文字放入HTML中,或者确保您可以在处理程序定义的范围内找到该函数(例如全局附加到window对象)。

http://knockoutjs.com/documentation/custom-bindings.html

JS Fiddle Example - http://jsfiddle.net/pqb4xubg/

,将建立处理程序中的JavaScript(在初始化更新):

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(公告具有“有趣”装订的元素如何不起作用):

<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的方式显式地调用这些函数。谢谢。美好的一天。