26

我有一个输入元素,它绑定到可观察到的淘汰赛:

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

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

原则上执行以下操作:

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

但是,它似乎有些笨拙。它还会在模板的初始实例化时触发,我只想在此之后处理更改。是否有官方/更简单的方法来根据可观察的变化触发事件?

4

2 回答 2

48

使用订阅:

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

如果您想重用此触发器,您可以考虑编写自定义绑定

于 2012-09-01T17:36:16.957 回答
3

如果您试图在绑定中获取额外信息,请使用并设置参数以引用指向函数的元素中的绑定名称。要么将函数文字放在 HTML 中,要么确保您可以在处理程序定义的范围内找到该函数(如全局附加到对象)。allBindings.get(nameOfOtherBinding)nameOfOtherBindingwindow

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

JS 小提琴示例 - http://jsfiddle.net/pqb4xubg/

将设置处理程序的 javascript(在initupdate中):

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>

您也可以只使用绑定的 init 来设置标准 DOM 事件处理程序,并使用 jQuery 之类的东西显式调用这些函数。谢谢你。再会。

于 2015-06-03T14:59:13.823 回答