Próbuję wykonać kod inicjujący w stanie nadrzędnym routery-ui-routera. Kod inicjujący to orderService.getStoreInfo()
, który zwraca obietnicę. Dopiero gdy ta obietnica zostanie rozwiązana, chcę wyzwolić stan dziecka. Jednak zauważam, że stan podrzędny jest wyzwalany jeszcze przed rozwiązaniem obietnicy rodzica. Co ja robię źle? Tutaj jest mój kod:routery ui wyzwalają stan potomka, zanim stan nadrzędny zostanie rozwiązany.
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',
});
}
Dziennik konsoli jest następująca:
home: resolve - orderService.getStoreInfo()
home.orders: resolve - orderService.getOrders()
... messages from orderService.getStoreInfo() ...
To wyraźnie pokazuje, że stan dziecka jest wypalanie nawet zanim stan rodzic został rozwiązany.
O ile mi wiadomo, jedynym sposobem na odroczenie rozwiązania jest nie zwrócenie obietnicy. – Claies
Czy próbowałeś jawnie wprowadzić 'storeInfo' do funkcji rozstrzygania stanu potomnego? Nie jestem pewien, czy to pomaga, po prostu ciekawi. –
@YauheniLeichanok, to był dokładnie problem! Ponownie czytam dokumenty ui-routera i wyraźnie stwierdzam, że "klucze rozstrzygania MUSZĄ być wstrzykiwane do stanów potomnych, jeśli chcesz poczekać na wyjaśnienie obietnic przed utworzeniem dzieci." Więc dziękuję. Jeśli podasz swoją sugestię jako odpowiedź, zaznaczę ją jako poprawną odpowiedź. Dzięki! – Naresh