如何使用 UI 路由器在传递给控制器之前解决承诺
How to use a UI router in order to resolve a promise before it is passed to the controller
我对 Angular promises 有疑问,需要有关如何最好地使用它们的帮助。
我有一个 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 是从承诺中获得的,我必须使用 pass 回调到 then 方法,PARENTS_NEEDS
var仅在回调范围内可用。
有人可以帮忙吗?
感谢 Charlietfl 和 Okazari 的建议和评论,我得出了以下结论:
我重新设计的服务:
.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
我对 Angular promises 有疑问,需要有关如何最好地使用它们的帮助。
我有一个 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 是从承诺中获得的,我必须使用 pass 回调到 then 方法,PARENTS_NEEDS
var仅在回调范围内可用。
有人可以帮忙吗?
感谢 Charlietfl 和 Okazari 的建议和评论,我得出了以下结论:
我重新设计的服务:
.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