уничтожить просмотр в контексте vnode в vuejs2

#javascript #vuejs2 #vue-directives

#javascript #vuejs2 #vue-директивы

Вопрос:

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

Есть ли какой-либо способ уничтожить предыдущий наблюдатель при вызове метода directive 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");
    }
});
  

Ответ №1:

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

 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();
    }
});
  

Ответ №2:

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

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

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

Комментарии:

1. есть ли какой-либо способ вызвать unwatch в методе unbind?

2. Может быть, попробуйте это : this.unbind.unwatchDependency = …; и в unbind : this.unwatchDependency ();