angular-ui / angular-ui/ui-router

child states of lazy loaded future states get stuck in stateQueue

オープン
#3,836 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る
stale
主要言語
TypeScript
スター
13.4k
フォーク
2.9k
PR マージ指標
30日以内にマージされた PR はありません

説明

This issue tracker is for Bug Reports and Feature Requests only.

Please direct requests for help to StackOverflow.
See http://bit.ly/UIR-SOF for details.

This is a (check one box):

- [x] Bug Report
- [ ] Feature Request
- [ ] General Query

My version of UI-Router is: 1.0.29

# Bug Report

#### Current Behavior:

- Define a main application state
- Define a future state to lazy load a module using the glob double wildcard
```
export const clientAdminLandingFutureState: Ng1StateDeclaration = {
name: 'clientAdmin.**',
parent: 'app',
url: '/admin',
lazyLoad: function(transition: Transition) {
const $ocLazyLoad: ILazyLoad = transition.injector().get('$ocLazyLoad');
const $log: ILogService = transition.injector().get('$log');

return import(
/* webpackChunkName: "clientAdminLanding" */ './client-admin-landing.module'
)
.then(({ ClientAdminLandingModule }) =>
$ocLazyLoad.load(ClientAdminLandingModule)
)
.catch((err) => $log.error(err));
}
};
```
- Define another future state to lazy load a module that is a child of the first state
```
export const proxyFutureState: Ng1StateDeclaration = {
name: 'proxy.**',
parent: 'clientAdmin',
url: '/proxy',
lazyLoad: (transition: Transition) => {
const $ocLazyLoad: ILazyLoad = transition.injector().get('$ocLazyLoad');
const $log: ILogService = transition.injector().get('$log');

return import(/* webpackChunkName: "proxy" */ './proxy.module')
.then(({ ProxyModule }) => $ocLazyLoad.load(ProxyModule))
.catch((err) => $log.error(err));
}
};
```
- Register each future state with the $stateRegistry
```
import { module } from "angular";

import { clientAdminLandingFutureState } from "./src/client-admin-landing/client-admin-landing.future-state";
import { proxyFutureState } from "./src/proxy/proxy-future-state";

const AppModule = module("appModule", []).config(
/* @ngInject */($stateRegistry, $stateProvider) => {
$stateProvider.state('app', {
abstract: true,
views: {
master: {
templateUrl: '/templates/core/master-layout.html',
controller: 'coreController'
},
}
});

$stateRegistry.register(clientAdminLandingFutureState);
$stateRegistry.register(proxyFutureState);
}
);
```
- When logging $stateRegistry.stateQueue.queue through the onStatesChanged listener or through an $onInit the child future state is still queued:
`[self: {name: "proxy.**", parent: "clientAdmin", url: "/proxy", lazyLoad: ƒ, $$state: ƒ}]`

#### Expected Behavior:

If the parent state is already defined, the child state should be registered and not queued. If the child state is put into the queue, it should be registered after the parent state is registered.

My thinking is that the double wildcard is preventing the child and parent names from matching

#### Link to Plunker or stackblitz that reproduces the issue:

See code sample above

コントリビューションガイド

コントリビューションガイドを開く

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。