Угловые часы не сработали

Существует 1 угловое приложение с 1 родительским контроллером и дочерним контроллером. У ребенка есть 1 $watch WATCH-CHILD для OBJ-CHILD, который запускает $emit. В родительском объекте есть прослушиватель для $emit, мы назовем его ON-LISTENER и $watch WATCH-PARENT для OBJ-PARENT (который использует true в качестве третьего аргумента).

Когда OBJ-CHILD ребенка изменяется, он запускает WATCH-CHILD, который запускает $emit. ON-LISTENER родительского слушателя срабатывает и меняет OBJ-PARENT. Он также устанавливает некоторые свойства $location. $ Watch WATCH-PARENT для OBJ-PARENT никогда не запускается (даже если значение изменилось), а также свойства, заданные для $location, не меняются в URL браузера (я знаю, что они действительно изменены внутри JavaScript, потому что я распечатать их).

Чтобы убедиться, что ON-LISTENER вызывается в $digest, я попытался вызвать $ digest в конце ON-LISTENER и получил ожидаемое исключение.

Есть идеи, если я делаю что-то не так? Я ожидаю, что изменения, которые происходят в ON-LISTENER, вызовут изменение WATCH-PARENT и URL браузера.

Я постараюсь воспроизвести на jsfiddle и отредактировать этот пост в случае успеха.

Код выглядит так:

РЕБЕНОК:

$scope.$watch('vars.model', function(newValue, oldValue) {
  console.log('model changed');
  $scope.$emit('highlightChange', newValue);
}, true);

Родитель:

$scope.$watch('vars.model.highlight', function(newValue, oldValue) {
  console.log('highlight changed');
}, true);

$scope.$on('highlightChange', function(event, value) {
  console.log('listener', $scope.vars.model.highlight.categoryId, value.categoryId);
  $location.search('category-id', value.categoryId);
  $scope.vars.model.highlight.categoryId = value.categoryId;
}

2 ответа

В следующий раз, пожалуйста, предоставьте больше кода, который работает, чтобы вы могли получить лучшие ответы.

Вот демонстрационный пример, который я создал, чтобы проверить предоставленный вами код. Работает просто отлично. Если бы вы могли предоставить больше кода, то мы могли бы найти реальную причину, по которой он не работал.

Я создал два контроллера parentCtrl и childCtrl, который использует ваш код и объект представленной структуры.

$scope.vars = {
   model:{
      highlight:{
        categoryId : 5 //This value is set for testing purposes
      }
   }
};

Кроме того, я изменил цель наблюдения (vars.model -> vars.model.highlight), чтобы она была такой же, как в родительском контроллере.

$scope.$watch('vars.model.highlight', function(newValue, oldValue) {
  console.log('child model changed (new/old)', newValue, oldValue);
  $scope.$emit('highlightChange', newValue);
  console.log('Emited change event');
}, true);

Спасибо за помощь. Я обнаружил, что мое событие произошло из-за ручного вызова $ scope. $ Digest() из-за того, что исходное событие было вызвано событием applyrange_daterangepicker daterangepicker. Когда я изменил это на $ scope. $ Apply, проблема, казалось, ушла. Исходя из этого, я могу предположить, что $apply() отвечает за продолжение вызова $watch, пока есть изменения, а $digest() этого не делает.

Для дальнейшего использования я разместил проблему здесь: https://plnkr.co/edit/ItkALhw16Aqukk3EFrRz?p=preview

$scope.digest();

должен стать

$scope.apply();
Другие вопросы по тегам