Зависимая загрузка данных
Первым запросом после загрузки Ангуляра мы получаем айди пользователя (потом можем его поменять). Далее все остальные запросы и вычисления производятся на основании этого айдишника. Примерно так это выглядит (айди записан в $rootScope)
.controller('myCtrl', ['$rootScope', 'Comments', function ($rootScope, Comments) { $rootScope.$watch('global.userId', function(newValue, oldValue) { if (newValue !== oldValue) { var comments = Comments.query({userId: newValue}, function (data) { commentFn(data); //Логика обработки комментариев }); } }); }]) Проблема в том, что во все контроллеры придется добавлять $watch и всю логику вычислять в нем. Как избавиться от подобной вложенности? Можно как-нибудь перезапустить все или некоторые контроллеры приложения при получении айди пользователя? |
а если держать значения в webStorage?
https://github.com/fredricrylander/angular-webstorage |
а в чем корень зла? :)
Если id будет меняться, можно так: app .run(function( $rootScope ) { $rootScope.$watch( 'global.userId', function( a, b ) { if ( angular.equals( a, b ) ) return; $rootScope.emit( 'my:event', a ); }); }) .controller('myCtrl', ['$rootScope', 'Comments', function ( $rootScope, com, $scope ) { var controller = $scope.controller = { method: function( id ) { alert( id ); } }; $rootScope.$on( 'my:event', function( event, id ) { controller.method( id ); }); }]) если нет, можно с $q. |
webStorage это хорошо, но нужно также предусмотреть случаи когда значение меняется в процессе работы.
Корень зла в том, что $rootScope.$on придется пихать практически в каждый контроллер. Идеальный вариант когда контроллеры перезапускаются при смене айди пользователя. Пока есть идея сделать боди шаблоном и инклудить его каждый раз заново... либо что-то подобное через роутер замутить. Вторая идея: проходится циклически по всем областям видимости, начиная с корневой, и запускать у каждой контроллер. Правда, пока не очень понятно как запусить контроллер отдельно взятой области... |
Идея.
можно вместо query использовать свой собственный метод который будет срабатывать как при изменении iserId и давать эффект аналогичный query. Фактически я предлагаю сделать функцию которая будет отслеживать изменение userId в rootScope и вызывать query, а уже query будет вызывать callback переданный твоей функции. Таким нехитрым образом задачу отслеживания изменения userId ты перенесешь из контролеров в сервисы. |
Цитата:
Решил задачу с помощью юи-роутера. Просто переходом по состояниям. Он как раз перезапускает контроллеры и кэширует темплейты |
Часовой пояс GMT +3, время: 02:34. |