6
我試圖在Angular ui-router的父狀態中執行一些初始化代碼。初始化代碼是orderService.getStoreInfo()
,它返回一個承諾。只有當這個承諾解決了,我是否想要觸發子狀態。但是,我注意到,甚至在父母的承諾解決之前,孩子的狀態就會被觸發。我究竟做錯了什麼?這裏有我的代碼:ui-router在父狀態解決之前觸發子狀態
function configure($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/');
$stateProvider
.state('home', {
abstract: true,
template: '<ui-view/>',
resolve: {
storeInfo: /* @ngInject */ function(orderService) {
console.log('home: resolve - orderService.getStoreInfo()');
return orderService.getStoreInfo();
}
}
})
.state('home.orders', {
url: '^/',
template: '<my-order-list data-orders="vm.orders"></my-order-list>',
resolve: {
orders: /* @ngInject */ function (orderService) {
console.log('home.orders: resolve - orderService.getOrders()');
return orderService.getOrders();
}
},
controller: ['orders', function (orders) {
this.orders = orders;
}],
controllerAs: 'vm',
});
}
控制檯日誌如下:
home: resolve - orderService.getStoreInfo()
home.orders: resolve - orderService.getOrders()
... messages from orderService.getStoreInfo() ...
這清楚地表明,雙親狀態已得到解決甚至在孩子狀態射擊。
據我所知,推遲決心的唯一方法是不返回承諾。 – Claies
您是否嘗試將'storeInfo'顯式注入子狀態的解析函數?不知道它是否有幫助,只是好奇。 –
@Yauheni Leichanok,這正是問題!我重新閱讀ui-router文檔,並明確指出:「如果您想在實例化子代之前等待承諾解決,必須將解析密鑰注入到子狀態中。」所以謝謝。如果您將您的建議作爲答案,我會將其標記爲正確答案。謝謝! – Naresh