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。
答
如果你想在你的绑定,然后使用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的方式显式地调用这些函数。谢谢。美好的一天。
手动订阅+1(http://knockoutjs.com/documentation/observables.html#explicitly_subscribing_to_observables) –
自定义绑定似乎对单个输入恕我直言,过度杀伤。订阅听起来对我来说是更好的选择。 –
正是我在找的东西。谢谢! - 关于自定义绑定:是否有一种方法可以对更改应该触发其他事件的字段进行通用绑定,并将该函数传递给HTML中的绑定内部执行? – gzost