уничтожить часы в контексте vnojs2 - PullRequest
4 голосов
/ 14 марта 2019

В методе привязки директивы есть vnode.context.$watch, и каждый раз, когда директива добавляется в HTML, она также добавляет другого наблюдателя с предыдущим наблюдателем. Из-за этого одни и те же наблюдатели звонят не раз.

Есть ли способ уничтожить предыдущего наблюдателя, когда вызван метод unbind директивы.

Vue.directive("dynamic-lookup", {
    bind: function (el, binding, vnode) {        
        let dependency = setValue("dynamic-lookup-dependency");       
        if (dependency) {
            vnode.context.$watch(dependency, function (newVal, oldVal) { }); });
        }
    },
    unbind: function(el, binding, vnode) {
        console.log("unbind");
    }
});

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Согласно документации , функция $watch сама возвращает функцию отмены просмотра. Вы можете сохранить возвращенную функцию в vnode.context и вызвать эту функцию в хуке unbind директивы следующим образом:

Vue.directive("dynamic-lookup", {
    bind: function (el, binding, vnode) {
        let unwatch = vnode.context.$watch(vnode.context.property, function (newVal, oldVal) { 
                //Do something
            }); 
        });
        if(!vnode.context['unwatch'])
            vnode.context['unwatch'] = unwatch;
    },
    unbind: function(el, binding, vnode) {
        vnode.context.unwatch();
    }
});
1 голос
/ 14 марта 2019

Я думаю, что вы можете разглядеть свою зависимость, когда захотите.

Документация vm.$watch возвращает unwatch function, который останавливает обратный вызов: https://vuejs.org/v2/api/#vm-watch

var unwatch = vnode.context.$watch(dependency, function (newVal, oldVal) {
});
// later, teardown the watcher
unwatch()
...