Зависимая загрузка данных
Первым запросом после загрузки Ангуляра мы получаем айди пользователя (потом можем его поменять). Далее все остальные запросы и вычисления производятся на основании этого айдишника. Примерно так это выглядит (айди записан в $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, время: 13:33. |