Как использовать фабрику / сервис, который выполняет Ajax-запрос в разрешении пользовательского интерфейса?

#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);
                  }