[英]AngularJs controller resolve dependency
使用這種方式在模態控制器中解析多個參數時遇到麻煩,例如:
controller : 'MyController',
controllerAs : 'vm',
resolve : {
resolveInfo : function(REST){
var resolveInfo = {}
return REST.doGet('/things/').then(
function(thingsResponse){
resolveInfo.things = thingsResponse.data;
return REST.doGet('/stuff1/' + '/mystuff/' + resolveInfo.things[0].id).then(
function(stuff1Response){
resolveInfo.stuff1 = stuff1Response.data;
return REST.doGet('/stuff2/' + '/mystuff/' + resolveInfo.stuff1[0] + '/' + resolveInfo.things[0].id).then(
function(stuff2Response){
resolveInfo.stuff2 = stuff2Response.data;
return resolveInfo;
}
);
}
);
}
)
}
然后在“ MyController”中,我從resolveInfo中取出這三個對象。 但我希望這樣的事情會起作用:
controller : 'MyController',
controllerAs : 'vm',
resolve : {
things : function(REST){
return REST.doGet('/things/').then(
function(thingsResponse){
return thingsResponse.data;
}
)
},
stuff1 : function(REST, things){
return REST.doGet('/stuff1/' + '/mystuff/' + things[0].id).then(
function(stuff1Response){
return stuff1Response.data
}
);
},
stuff2 : function(REST, stuff1, things){
return REST.doGet('/stuff2/' + '/mystuff/' + stuff1[0] + '/' + things[0].id).then(
function(stuff2Response){
return stuff2Response.data;
}
);
}
但這讓不知名的提供者大喊“事情”
有沒有辦法做到這一點?
當您要等待多個promise時,可以使用$q.all([promise1, promise2, ...])
,但是要使用先前promise的結果。
基本的重組可以解決您的問題:
function resolveInfo(REST) {
function getThings() {
return REST.doGet('/things/').then(
function (resp) {
return getStuff1(resp.data);
});
}
function getStuff1(things) {
return REST.doGet('/stuff1/mystuff/' + things[0].id).then(
function (resp) {
return getStuff2(things, resp.data);
});
}
function getStuff2(things, stuff1) {
return REST.doGet('/stuff2/mystuff/' + stuff1[0] + '/' + things[0].id);
}
return getThings();
}
因此,您將在promise處理程序中返回promise, then
將其鏈接到promise。 以下是有關此主題的適當文檔: http : //solutionoptimist.com/2013/12/27/javascript-promise-chains-2/
使用ngRoute或ui-router時, resolve參數應立即返回其值或返回Promise。 代碼的問題在於,您在等待諾言結束之前,要返回一個值,該值將無法正確解析。
Javascript路由
這是返回承諾的更新的路線代碼。
controller : 'MyController',
controllerAs : 'vm',
resolve : {
things : function(REST){
return REST.doGet('/things/');
},
stuff1 : function(REST, things){
return REST.doGet('/stuff1/' + '/mystuff/' + things[0].id);
},
stuff2 : function(REST, stuff1, things){
return REST.doGet('/stuff2/' + '/mystuff/' + stuff1[0] + '/' + things[0].id);
}
}
Javascript控制器
這是示例控制器,然后可以使用已解析的參數。
.controller('MyController', function(things, stuff1, stuff2) {})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.