13

我有一个外部 javascript 库,它触发文本区域的更改、格式化等。

但是,当 KnockoutJS 将值设置为 textarea 时,不会触发 change 事件。我的问题的简化小提琴。当 Knockout 更新我的 textarea 的值时,是否可以触发 change 事件?

4

2 回答 2

9

您可以在底层 observable 上设置订阅,而不是试图强制 Knockout 处理更改事件。像这样:http: //jsfiddle.net/EZC9E/1/

this.text.subscribe(function(newValue) {
    alert('Text is changing to ' + newValue);
});        
于 2012-06-21T09:34:02.880 回答
2

您可以考虑将其包装到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');
        });
    }
}
于 2014-09-08T21:16:35.327 回答