Как я могу начать новый цикл дайджеста в angularjs, чтобы переменные выбирались веб-страницей? - PullRequest
0 голосов
/ 30 января 2019

У меня есть переменная, которая изменяется после или во время цикла дайджеста, и эта переменная не отображается на веб-странице, которая ссылается на нее через AngularJS, пока не будет нажата кнопка - фактически любая кнопка.

Я пыталсяsetTimeout, обертывающий scope.apply, и я сделал тайм-аут достаточно длинным, чтобы тайм-аут действительно имел место после изменения переменной, но безуспешно, чтобы изменение отразилось на веб-странице.

Я добавил этот код, который, согласно другому сообщению о переполнении стека, должен быть пуленепробиваемым:

setTimeout(function  () {
   $scope.$apply(function () {
$scope.message = "Timeout called";
//ADDED BELOW
$scope.curentUserAuthority = GlobalService.currentUserAuthority;
$scope.currentUserViewName = GlobalService.currentUserViewName;
//ADDED ABOVE
LoggingService.info('Timeout called!!!');
});
}, 10000);

Тайм-аут действительно происходит после изменения переменной, и сообщение «Тайм-аут вызван» выводится на консоль, но ничего не происходит сстраница интернета.Я думал, что $ scope.apply запустит новый цикл дайджеста, как нажатие кнопки.Что я делаю неправильно?Спасибо за ваше время.

РЕДАКТИРОВАТЬ: Это работает, когда я добавляю две строки между ДОБАВЛЕННЫМИ комментариями выше.Чего я не понимаю, так это почему я должен делать это, когда у меня есть процедуры просмотра, ищущие изменения в этих переменных.Пример одного

$scope.$watch('currentUserAuthority', function() {
LoggingService.info(' WATCHING YOU currentUserAuthority is '+$scope.currentUserAuthority);
});

Вышеприведенная функция никогда не сработает, пока функция ПОСЛЕ моего $ scope. $ Apply не будет выполнена в результате моего тайм-аута.Weird.Я что-то не понимаю?

1 Ответ

0 голосов
/ 31 января 2019

Ваша проблема в том, что вы пытаетесь сослаться на состояние, которое находится в каком-либо другом сервисе, и изменение этого состояния не вызовет дайджест в вашей локальной области или областях.

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

Невозможно точно указать, как вы «должны» реализовать это, так как angularJS - это мультипарадигмальная инфраструктура, но я могу дать вам несколько разных способов сделать это.

Использование API компонентав angular1.5 + у вас будет родительский компонент, который будет содержать состояние «один источник правды», и вы сможете получать обновления с помощью одностороннего связывания и «<» и $ onChanges () </p>

https://docs.angularjs.org/guide/component

Используя $ scope. $ Broadcast / $ scope. $ Emit события, которые вы можете транслировать из любого места, изменяются вверх или вниз по цепочке областей действия (или даже $ broadcast от $ rootScope, чтобы охватить все $ scopes). С помощью этого вы можетеследуйте подмодели паба, где, когда необходимо обновить ваше состояние, вы можете использовать $ broadcast или $ emit события, а соответствующие контроллеры прослушивают эти события с $ on

https://docs.angularjs.org/guide/scope (ищите распространение)

Я действительно не рекомендую это, если вы не делаете манипуляции с DOM (возможно, у меня есть очень хороший вариант использования для этого)

И наконецвы все еще можете использовать наблюдатели, но эти данные должны передаваться другими директивами / ng-controller / routs / components.Для этого снова потребуется одна директива / ng-controller, чтобы передать эти значения дочерним директивам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...