$ watch работает только без watchExpression - PullRequest
0 голосов
/ 12 февраля 2019

В моем $onInit у меня есть $watch:

public $onInit() {
    const name = this.$state.current.name;
    console.log(name);
    this.$scope.$watch(name, (oldVal, newVal) => {
        console.log(oldVal, newVal);
        console.log(this.$state.current.name;
    });
}

Когда я запускаю этот код, oldVal, newVal оба равны undefined, а значение this.$state.current.name одинаково в области видимости$watch и вне его.

Когда я запускаю код без выражения name:

public $onInit() {
    const name = this.$state.current.name;
    console.log(name);
    this.$scope.$watch((oldVal, newVal) => {
        console.log(oldVal, newVal);
        console.log(this.$state.current.name);
    });
}

$watch постоянно запускается.oldVal равно Scope {$id: 353, .... etc, но newVal не определено.Но this.$state.current.name теперь обновляется внутри области действия $watch.

Таким образом, значение this.$scope.current.name действительно изменяется.Но когда я использую это как выражение в $watch, oldVal, newVal оба не определены, а this.$state.current.name не изменяется внутри $watch.

Похоже, я что-то делаю не такв watchExpression.Есть предложения?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Это ожидаемое поведение $watch функция.

Из документов

$watch(watchExpression, listener, [objectEquality]);
// watchExpression - can be `expression/function` 
// listener - callback
// objectEquality - deepWatch

$watch функция оценивает свою expression относительно $scope на каждомцикл дайджеста.Таким образом, при первом подходе вы просто передаете name как string, так что происходит, когда начинается цикл дайджеста, он пытается вычислить переменную name, которая, очевидно, не существует в $scope, поэтомувы получаете undefined значение для каждой $watch оценки.

В то время как при втором подходе вы передаете function/callback в $watch функцию.который оценивает при каждом цикле дайджеста, что неправильно.Что вы должны сделать, это передать callback функцию, которая будет возвращать this.$state.current.name, тогда только вы получите желаемые результаты в $watch функции слушателя.


Это можно решить, используя ниже

this.$scope.$watch(() => {
   return this.$state.current.name
}, (oldVal, newVal) => {
    console.log(oldVal, newVal);
    console.log(this.$state.current.name;
});
0 голосов
/ 12 февраля 2019

Аргумент watchExpression должен быть задан как строка (даже если она уже является строкой). Вы пробовали это?

var name = 'some value'
this.$scope.$watch('name', (oldVal, newVal) => {
    console.log(oldVal, newVal);
    console.log(this.$state.current.name);
});

Документация

...