#javascript #angularjs #angularjs-directive #angularjs-scope
#javascript #angularjs #angularjs-директива #angularjs-область
Вопрос:
Я хочу инициализировать глобальную переменную «$ rootScope.SegmentSelectedGlobal» только при запуске приложения. Эта глобальная переменная получает данные из сервиса. Если я выполняю сервис через контроллер, он работает нормально. Но когда я выполняю его из App.run, значение не оценивается, и об ошибке не сообщается.
Вот код:
App.run :
app.run(['$rootScope','DashboardService', function($rootScope,DashboardService) {
$rootScope.SegmentSelectedGlobal = DashboardService.getSegments();
}]);
Обслуживание :
app.service("DashboardService",function($q,$http,errorMessages){
var allSegements = [];
return {
// For selected Only
getSegments : getSegments
}
function getSegments(){
var deferred = $q.defer();
$http({
url: "/getAllSegments",
method: "GET"
}).success(function (data, status, headers, config) {
deferred.resolve(data);
allSegements = data;
}).error(function (data, status, headers, config) {
//logger.logError('Error while retrieving Versions details');
allSegements = null;
});
return allSegements;
}
});
Спасибо за вашу помощь.
Ответ №1:
Он возвращается undefined
, потому что at return allSegements
allSegements
не определено.
Вы используете обещание, но забыли вернуть его правильно
app.service("DashboardService",function($q,$http,errorMessages){
var allSegements = [];
return {
// For selected Only
getSegments : getSegments
}
function getSegments(){
var deferred = $q.defer();
$http({
url: "/getAllSegments",
method: "GET"
}).success(function (data, status, headers, config) {
deferred.resolve(data);
allSegements = data;
}).error(function (data, status, headers, config) {
//logger.logError('Error while retrieving Versions details');
deferred.reject();//--------- REJECT IF ERROR
});
return deferred.promise;//------- RETURN THE PROMISE
}
});
app.run(['$rootScope','DashboardService',function($rootScope,DashboardService) {
// use then to get the data from your promise ince it's ready
DashboardService.getSegments().then(function(data){
$rootScope.SegmentSelectedGlobal = data;
});
}]);
Примечание. если вы хотите дождаться разрешения обещанного перед загрузкой вашей страницы, используйте resolve
атрибут (доступный как в ngRoute, так и в ui-router) :
resolve:{
segments:['DashboardService', function(DashboardService){
return DashboardService.getSegments();//we return the promise, the resolve parameter will take the result, in case of error page won't be loaded.
}];
}