我有一个外部 javascript 库,它触发文本区域的更改、格式化等。
但是,当 KnockoutJS 将值设置为 textarea 时,不会触发 change 事件。我的问题的简化小提琴。当 Knockout 更新我的 textarea 的值时,是否可以触发 change 事件?
我有一个外部 javascript 库,它触发文本区域的更改、格式化等。
但是,当 KnockoutJS 将值设置为 textarea 时,不会触发 change 事件。我的问题的简化小提琴。当 Knockout 更新我的 textarea 的值时,是否可以触发 change 事件?
您可以在底层 observable 上设置订阅,而不是试图强制 Knockout 处理更改事件。像这样:http: //jsfiddle.net/EZC9E/1/
this.text.subscribe(function(newValue) {
alert('Text is changing to ' + newValue);
});
您可以考虑将其包装到Custom Knockout Binding中,而不是更改 javascript 库。无论如何,您可能已经需要为您的库使用自定义绑定,特别是如果您正在使用任何foreach
动态生成/销毁元素的绑定。
获得自定义绑定后,您就有了一个非常方便的地方来触发“更改”。
ko.bindingHandlers.jQueryPluginFunctionCall = {
init: function (element, valueAccessor, allBindingsAccessor) {
// Apply jQuery plugin to textarea
$(element).jQueryPluginFunctionCall();
// Subscribe to the value binding of the textarea, and trigger the change event.
allBindingsAccessor().value.subscribe(function () {
$(element).trigger('change');
});
// Clean up jQuery plugin on dispose
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
// This will be called when the element is removed by Knockout or
// if some other part of your code calls ko.removeNode(element)
$(element).jQueryPluginFunctionCall('destroy');
});
}
}