Knockout.JS:基于可观察的变化触发

时间:2012-09-01 17:11:20

标签: triggers knockout.js observable

我有一个输入元素绑定到一个可以观察到的敲除:

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

这会更新每个keyup上的observable。我现在想要在值更改时触发其他事件。

以下原则上这样做:

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

然而,它似乎有点笨重。它还会在模板的初始实例化时触发,我只想在此之后处理更改。 是否有一种官方/更简单的方法可以根据对可观察量的变化触发事件?

2 个答案:

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