#javascript #angularjs #promise #angular-ui-router
#javascript #angularjs #обещание #angular-ui-router
Вопрос:
Я использую ui-router (http://angular-ui.github.io/ui-router/site/#/api/ui.router ) решение для мастера форм и моей конфигурации состояния выглядит следующим образом:
$stateProvider
.state('TabsView', {
url: '/mcm/:mcmcid',
controller: 'TabsController',
templateUrl: 'ngapps/mcm/views/TabsView.html'
})
.state('TabsView.Campaign Info', {
url: '/campaign-info',
templateUrl: 'ngapps/mcm/views/Campaign Info.html',
resolve: {
campaignFactory: 'CampaignFactory',
campaignData: function($stateParams,campaignFactory) {
return campaignFactory.getCampaignInfo($stateParams.mcmcid).$service;
}
},
controller: 'CampaignInfoController'
});
Для состояния «TabsView.Campaign Info» я пытаюсь разрешить campaignData, вызвав CampaignFactory. Код для Campaign Factoy выглядит следующим образом:
marketingCampaignModule.factory("CampaignFactory", ['AjaxFactory', '$q', function(AjaxFactory, $q) {
return {
getCampaignInfo: function(mcmcid) {
var result = {empty: true};
if (mcmcid > 0) {
var ajaxPromise = AjaxFactory.post("index.php/mcm/infosave/view", {mcmcid: mcmcid});
ajaxPromise.then(function(data) {
if (data['success']) {
if (data['params']) {
result = {'name': data['params']['name'], 'description': data['params']['description']};
}
}
return resu<
});
}
}
};
}]);
campaignData в resolve не разрешается. Но я вижу, что в консоли выполняется вызов функции getCampaignInfo CampaignFactory. Я знаю, что делаю что-то не так с promise.Пожалуйста, скажите мне, что я делаю не так?
Согласно комментарию Чандермани, я изменил factory, чтобы вернуть обещание следующим образом:
marketingCampaignModule.factory("CampaignFactory", ['AjaxFactory', '$q', function(AjaxFactory, $q) {
return {
getCampaignInfo: function(mcmcid) {
var deferred = $q.defer();
var result = {empty: true};
if (mcmcid > 0) {
var ajaxPromise = AjaxFactory.post("index.php/mcm/infosave/view", {mcmcid: mcmcid});
ajaxPromise.then(function(data) {
if (data['success']) {
if (data['params']) {
result = {'name': data['params']['name'], 'description': data['params']['description']};
}
}
deferred.resolve(result);
});
}else{
deferred.resolve(result);
}
return deferred.promise;
}
};
}]);
И изменил разрешение следующим образом:
resolve: {
campaignFactory: 'CampaignFactory',
campaignData: function($stateParams,campaignFactory) {
campaignFactory.getCampaignInfo($stateParams.mcmcid).then(function(data){
return data;
});
}
}
По-прежнему не работает. Что я делаю не так?
Комментарии:
1. Вам нужно вернуть обещание из метода getCampaignInfo. И где-то в обратном вызове используйте defer api для его разрешения. Прочитайте о сервисе $ q
Ответ №1:
После выполненного вами обновления вам просто не хватает оператора return в resolve
campaignData: function($stateParams,campaignFactory) {
return campaignFactory.getCampaignInfo($stateParams.mcmcid);
}