【问题标题】:How to use factory/service which makes an Ajax request in ui-router resolve?如何使用在 ui-router 解析 Ajax 请求的工厂/服务?
【发布时间】:2014-08-20 23:45:05
【问题描述】:

我正在为表单向导使用 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”状态,我尝试通过调用 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 result;
                });
            }
        }
    };

}]);

解析中的campaignData 无法解析。但我看到在控制台中调用了 CampaignFactory 的 getCampaignInfo 函数。我知道我在承诺方面做错了。请告诉我我做错了什么?

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

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修改如下:

resolve: {
                  campaignFactory: 'CampaignFactory',
                  campaignData: function($stateParams,campaignFactory) {
                      campaignFactory.getCampaignInfo($stateParams.mcmcid).then(function(data){
                          return data;
                      });
                  }
              }

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

【问题讨论】:

  • 您需要从 getCampaignInfo 方法返回一个承诺。并且在回调中的某处使用 defer api 来解决它。了解 $q 服务

标签: javascript angularjs promise angular-ui-router


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多