【问题标题】:How to use a UI router in order to resolve a promise before it is passed to the controller在将 Promise 传递给控制器​​之前,如何使用 UI 路由器解决 Promise
【发布时间】:2015-08-05 14:03:18
【问题描述】:

我对 Angular Promise 有疑问,需要有关如何最好地使用它们的帮助。

我有一个domainService,它从服务器端检索数据,如下所示:

parentsNeeds: function () {
    return $http.get('/api/utils/parents-needs', {
        cache: true
    });
},

我有一个constantsService,它使用domainService 将数组转换为对象,如下所示:

.factory('constantsService', ['domainService', '$q', function (domainService, $q) {

        var convertToObject = function (param) {
            var parentsNeeds = {};
            for (var i = 0; i < param.data.length; i++) {
                parentsNeeds[param.data[i]] = i;
            }
            return parentsNeeds;
        };
        return {
            PARENTS_NEEDS: domainService.parentsNeeds().then(convertToObject)
        };
    }]);

在 UI 路由器配置中,我有以下解决方法:

resolve: {
    constants: ['constantsService', function (constantsService) {
        return {PARENTS_NEEDS: constantsService.PARENTS_NEEDS};
    }]
}

在我的控制器中,我注入 constants 解析并按如下方式使用它:

constants.PARENTS_NEEDS.then(function(param){
   var PARENTS_NEEDS = param;
});

问题是PARENTS_NEEDS var 在我的控制器中可用,并且假设它是从承诺中获得的,我必须在回调中使用传递给 then 方法,PARENTS_NEEDS var 仅在回调中可用范围。

有人可以帮忙吗?

【问题讨论】:

  • 在 ui-router resolve 你实际上可以简单地返回一个承诺。在 promise 解决之前,ui-router 不会加载视图。我想你可以尝试直接返回“constantsService.PARENTS_NEEDS”
  • @Okazari,是的,它工作正常。谢谢。但是,如何将多个常量封装到一个常量对象中,以避免将不合理数量的常量注入我的控制器(我有很多......)?
  • 如果这些是constants,您不能让服务在一个承诺中将它们全部作为一个对象返回吗?
  • 嗨@charlietfl,怎么样?我不知道该怎么做..
  • 它们都需要api调用吗?如果是这样可以使用$q.all

标签: angularjs angular-ui-router angular-promise


【解决方案1】:

感谢 Charlietfl & Okazari 的建议和 cmets,我想出了以下几点:

我重新设计的服务:

.factory('constantsService', ['domainService', '$q', function (domainService, $q) {

    var convertToObject = function (param) {
        var object = {};
        for (var i = 0; i < param.data.length; i++) {
            object[param.data[i]] = i;
        }
        return object;
    };

    var PARENTS_NEEDS = domainService.parentsNeeds().then(convertToObject);
    var CHILDCARE_WORKER_TYPES = domainService.childcareWorkerTypes().then(convertToObject);
    //and so on and so forth...


    return {
        constants: $q.all({PARENTS_NEEDS: PARENTS_NEEDS, CHILDCARE_WORKER_TYPES: CHILDCARE_WORKER_TYPES})
    };
}]);

在我的 UI 路由器中:

constants: ['constantsService', function (constantsService) {
    return constantsService.constants;
}]

然后我在我的控制器中获得了一个不错的 constants 对象(已解决的承诺)。该对象包含两个常量:

Object {PARENTS_NEEDS: Object, CHILDCARE_WORKER_TYPES: Object}CHILDCARE_WORKER_TYPES: ObjectASSISTANTE_MATERNELLE: 1AUXILIAIRE_PARENTALE: 0AU_PAIR: 3BABY_SITTER: 2__proto__: ObjectPARENTS_NEEDS: ObjectPARENTS_TO_CHILDCARE_WORKER: 0PARENTS_TO_PARENTS: 1__proto__: Object__proto__: Object

【讨论】:

  • 这并不是我真正想到的......可以通过将实际的 $http 承诺传递给 $q.all 来使其更清晰。你传递的不是承诺,它们是包含承诺的对象。您将使用 .then 返回常量对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
相关资源
最近更新 更多