2015-07-28 2 views
1

Я использую $ watchGroup для просмотра ряда полей и запуска ряда функций в зависимости от того, какое конкретное поле было изменено.

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

$scope.$watchGroup(['first', 'second', 'third'], function(newValues, oldValues) 
    { 
    var message = 
    { 
     first: newValues[0], 
     second: newValues[1], 
     third: newValues[2], 
     firstOld: oldValues[0], 
     secondOld: oldValues[1], 
     thirdOld: oldValues[2] 
    }; 

    if(newValues[0] !== oldValues[0]){ 
     console.log('First changed') 
    } 

    if(newValues[1] !== oldValues[1]){ 
     console.log('Second changed') 
    } 

    if(newValues[2] !== oldValues[2]){ 
     console.log('Third changed') 
    } 

    $scope.messages.push(message); 
    }); 

Сценарий включает в себя три наблюдаемых поля, и я хотел бы вызвать функцию в зависимости от того, какое поле было изменено. Я использовал «newValues» и «oldValues», чтобы контролировать, какое поле изменилось.

Проблема, с которой я столкнулся, заключается в том, что если я изменил поле «Второе», тогда перейдите и измените поле «Первое» или «Третье», функция «Второе» запускается как ее сохранение предыдущего ' newValues ​​'и' oldValues ​​', что делает его похожим на поле «Второе», как показано в этом image.

Я выделил аномалию на картинке. Я бы ожидал, как только я начал менять поле «Третье», «newValues» и «oldValues» для «Second» будут такими же, как и не изменением поля.

Я знаю, что я мог бы сохранить два уровня старых ценностей и сравнить их, чтобы обойти это, но я бы ожидал, что он будет работать, как я описал. Любые разъяснения, если это ошибка или предполагаемая функциональность, будут оценены.

Угловая документация для $ watchGroup гласит, что watchExpressions - это «Массив выражений, которые будут индивидуально наблюдаться с помощью $ watch()». Это заставляет меня думать, что это не предназначенная функциональность.

+0

Я имеющим подобную проблему с чем-то я работаю и хотел бы узнать, какое watchExpression вызвало функцию прослушивания $ watchGroup. Хотелось бы услышать решение для этого! –

ответ

0

Going угловых документов за $ наблюдать группу и , что он внутренне использует $ часов для каждого индивидуального выражения Я думаю, что вы видите, это ожидаемое поведение

Из документов за $ watchGroup,

* The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching 
    * those of `watchExpression` 
    * and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching 
    * those of `watchExpression` 

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

Во-вторых, $ watchGroup внутренне вызывает $ watch [И то, что вы видите, такое же поведение для просмотра]. $ watch обновляет последнее значение и текущее значение, а затем вызывает функцию слушателя только в том случае, если текущее значение отличается от последнего значения. Поэтому в этом случае, скажем, когда вы обновляете выражение «first» после выражения «second», функция-слушатель не вызывается для выражения «second», а старое значение по-прежнему «второе значение».

Если ваша функция прослушивателя действительно зависит от того, какое выражение изменилось, тогда вам лучше использовать $ watch вместо $ watchGroup [IMHO, я не вижу разницы в производительности, поскольку часы $ будут запущены для всех выражений]. Но если вы хотите вызвать обычный обработчик и передать все новые значения независимо от того, какое выражение изменилось, вы можете пойти за $ watchGroup.

Все сказанное, было бы еще хорошо, если бы вы могли бы отправить это в угловой группе и получить его подтверждение от «рот лошади» :)

Смежные вопросы