Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Зависимая загрузка данных (https://javascript.ru/forum/angular/42589-zavisimaya-zagruzka-dannykh.html)

Shitbox2 01.11.2013 19:04

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

Можно как-нибудь перезапустить все или некоторые контроллеры приложения при получении айди пользователя?

jsru_ 01.11.2013 20:30

а если держать значения в webStorage?
https://github.com/fredricrylander/angular-webstorage

nerv_ 01.11.2013 20:30

а в чем корень зла? :)

Если 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.

Shitbox2 02.11.2013 12:13

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

Корень зла в том, что $rootScope.$on придется пихать практически в каждый контроллер. Идеальный вариант когда контроллеры перезапускаются при смене айди пользователя. Пока есть идея сделать боди шаблоном и инклудить его каждый раз заново... либо что-то подобное через роутер замутить. Вторая идея: проходится циклически по всем областям видимости, начиная с корневой, и запускать у каждой контроллер. Правда, пока не очень понятно как запусить контроллер отдельно взятой области...

DjDiablo 03.11.2013 16:21

Идея.

можно вместо query использовать свой собственный метод который будет срабатывать как при изменении iserId и давать эффект аналогичный query. Фактически я предлагаю сделать функцию которая будет отслеживать изменение userId в rootScope и вызывать query, а уже query будет вызывать callback переданный твоей функции.

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

Shitbox2 05.11.2013 11:02

Цитата:

Сообщение от DjDiablo (Сообщение 279330)
а уже query будет вызывать callback переданный твоей функции.

Придется тогда во всех контроллерах этот query лепить, что тоже не хорошо.

Решил задачу с помощью юи-роутера. Просто переходом по состояниям. Он как раз перезапускает контроллеры и кэширует темплейты


Часовой пояс GMT +3, время: 02:34.