Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.11.2013, 19:04
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

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

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

Последний раз редактировалось Shitbox2, 01.11.2013 в 19:11.
Ответить с цитированием
  #2 (permalink)  
Старый 01.11.2013, 20:30
Аватар для jsru_
Кандидат Javascript-наук
Отправить личное сообщение для jsru_ Посмотреть профиль Найти все сообщения от jsru_
 
Регистрация: 09.04.2013
Сообщений: 149

а если держать значения в webStorage?
https://github.com/fredricrylander/angular-webstorage
Ответить с цитированием
  #3 (permalink)  
Старый 01.11.2013, 20:30
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

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

Если 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.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 01.11.2013 в 20:33.
Ответить с цитированием
  #4 (permalink)  
Старый 02.11.2013, 12:13
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

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

Корень зла в том, что $rootScope.$on придется пихать практически в каждый контроллер. Идеальный вариант когда контроллеры перезапускаются при смене айди пользователя. Пока есть идея сделать боди шаблоном и инклудить его каждый раз заново... либо что-то подобное через роутер замутить. Вторая идея: проходится циклически по всем областям видимости, начиная с корневой, и запускать у каждой контроллер. Правда, пока не очень понятно как запусить контроллер отдельно взятой области...
Ответить с цитированием
  #5 (permalink)  
Старый 03.11.2013, 16:21
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Идея.

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

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

Последний раз редактировалось DjDiablo, 03.11.2013 в 16:24.
Ответить с цитированием
  #6 (permalink)  
Старый 05.11.2013, 11:02
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Сообщение от DjDiablo Посмотреть сообщение
а уже query будет вызывать callback переданный твоей функции.
Придется тогда во всех контроллерах этот query лепить, что тоже не хорошо.

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка данных с другого сервера, вопрос по поводу кодировки! Niksik Серверные языки и технологии 2 01.01.2013 09:44
ComboBox - загрузка данных posta ExtJS 4 25.03.2012 21:01
Двойная Фильтрация данных таблицы David0707 Общие вопросы Javascript 0 19.03.2012 13:00
Загрузка данных из MS SQL в список <select> Mike1983 Firefox/Mozilla 4 27.05.2011 19:01
загрузка данных из XML, почему загружает только в Explorer asked86 AJAX и COMET 2 18.12.2009 16:29