Javascript 如何在ui路由器解析中使用发出Ajax请求的工厂/服务?

Javascript 如何在ui路由器解析中使用发出Ajax请求的工厂/服务?,javascript,angularjs,promise,angular-ui-router,Javascript,Angularjs,Promise,Angular Ui Router,我将ui-router()解决方案用于表单向导,我的状态配置如下所示: $stateProvider .state('TabsView', { url: '/mcm/:mcmcid', controller: 'TabsController', templateUrl: 'ngapps/mcm/views/TabsView.html' }) .state('TabsView.Campaign Info', { url: '/campaign-i

我将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”,我尝试通过调用活动工厂来解析活动数据。活动工厂的代码如下所示:

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

}]);
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;
                      });
                  }
              }
无法解析resolve中的活动数据。但是我看到在控制台中调用了活动工厂的getActivationInfo函数。我知道我的承诺有问题。请告诉我我做错了什么

根据Chandermani的评论,我修改了工厂,以返回如下承诺:

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

}]);
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;
                      });
                  }
              }
并将决议修改如下:

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

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

还是不行。我做错了什么?

在完成更新后,您只是缺少resolve中的return语句

 campaignData: function($stateParams,campaignFactory) {
                   return  campaignFactory.getCampaignInfo($stateParams.mcmcid);
                  }

您需要从getCampaignInfo方法返回承诺。在回调的某个地方,使用deferAPI来解决它。了解$q服务