Вопрос по javascript, knockout.js – Событие изменения не срабатывает, когда Knockout обновляет значение

13

У меня есть внешняя библиотека javascript, которая запускает изменение текстовой области, форматирует ее и т. Д.

Однако когда KnockoutJS устанавливает значение для текстовой области, событие изменения не запускается.Упрощенная скрипка моей проблемы, Можно ли запустить событие изменения, когда Knockout обновляет значение моей текстовой области?

Ваш Ответ

2   ответа
9

чтобы заставлять Knockout работать с событиями изменений, вы можете настроить подписку на базовую наблюдаемую. Как это:http://jsfiddle.net/EZC9E/1/

this.text.subscribe(function(newValue) {
    alert('Text is changing to ' + newValue);
});        
Благодарю за ваш ответ. Я знаю об этом решении. Однако я использую отдельную библиотеку, которую не хочу изменять для этой цели. Jesse van Assen
В конце концов я пошел с этим решением, потому что, честно говоря, я не мог найти другой путь для достижения желаемого результата. Он включал в себя изменение библиотеки, которая мне не нравится, но она работает сейчас, и это самое главное. Jesse van Assen
1

чтобы изменять библиотеку javascript, вы можете рассмотреть возможность ее оборачивания вCustom Knockout Binding, В любом случае вам, возможно, придется использовать пользовательскую привязку для вашей библиотеки, особенно если вы используете какую-либо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');
        });
    }
}

Похожие вопросы