2015-05-15 3 views
0

Это моя первая сборка AngularJS, и я совершенно новичок в ней (я в первую очередь являюсь back-end dev).Угловые .run() значения инициализирующего контроллера

Мне нужно сохранить некоторые глобальные значения, которые затем будут использоваться другими контроллерами/директивами на странице, а также будут переданы в API-запросы на бэкэнд. Я пытаюсь избежать использования $ rootScope и думаю, что смогу это сделать, создав службу для хранения значений типа global/session.

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

Все, кажется, работает нормально - мой backend api попадает и возвращает объект JSON, но я думаю, что homeCtrl запускается слишком быстро, так как я получаю «Не могу прочитать свойство« пользователь »неопределенный». Если я console.log (response.data), то я могу увидеть объект JSON, поэтому я знаю, что он возвращается, но это происходит ПОСЛЕ неподтвержденной ошибки пользователя.

Поэтому я считаю, что что-то не так в отношении таймингов и обещаний.

Как мне создать службу, которую я могу заполнить свойствами при инициализации, а затем поделиться между контроллерами/директивами?

Любые указатели или оцененная помощь

Мое приложение JS

var app = angular.module('myApp', ['ngRoute']) 
/* Set our routing and templates */ 
.config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) { 

    /*Enable HTML5 mode - removes # from URL*/ 
    $locationProvider.html5Mode(true); 

    $routeProvider 
     .when('/', { 
      controller: 'homeCtrl', 
      template: '<h2 ng-controller="homeCtrl">We are home</h2><p>User type string: {{ userType }}</p>' 
     }) 
     .when('/my-status', { 
      template: '<h2>We are my profile</h2>' 
     }) 
     .otherwise({redirectTo: '/'}); 
}]) 

/* gather Global variables and store */ 
.run(['mySession',function(mySession){ 
    mySession.init(); 
}]); 


app.controller('homeCtrl', ['mySession', function ($scope, mySession) { 

$scope.userType = (mySession.employeeType == "1") ? "Admin" : "User"; 

}]); 

app.factory('mySession',['$http','$q',function($http, $q){ 

    var user = {}; 
    var displayState = 0; 


    return { 
     init : function(){ 
      return $http.get('/api/users/1') 
       .then(function(response) { 
        if (typeof response.data === 'object') { 
         this.user = response.data; 
         return true; 
        } else { 
         // invalid response 
         return $q.reject(response.data); 
        } 

       }, function(response) { 
        // something went wrong 
        return $q.reject(response.data); 
       }); 
     } 
    }; 
}]) 
+0

у вас нет доступа к 'user' сам объект ... добавить его вернуть объект – charlietfl

ответ

0

Я предлагаю вам использовать: ngStorage, что позволяет использовать для хранения (настойчивый другой множественным сеанса) & Session (один сеанс только)

См. Официальный документ: https://github.com/gsklee/ngStorage

Затем, чтобы инициализировать их перед чем-либо, initilia зе их в app.run()

Чтобы использовать его, впрыснуть ngStorage к каждому из контроллеров/услуг, которые необходимы эти значения