L'applicazione si trova su ngrx-popup
- @ngrx/router-store, aggiunto due attributi allo store 'primary' e 'popUp' :
export const initialState: State = {
state: null,
navigationId: null,
extras: null,
primary: null,
popUp: null,
};
- azioni aggiunte:
- RouterGo
- RouterGoPerformed
- RouterGoPopUp
- RouterGoPopUpPerformed
- RouterPopState
- RouterBack
- selettori aggiunti:
- selectOptions
- selectPrimary
- selectPopUp
- hasPopUp
Si ereditano i vantaggi offerti dalle rotte:
- Lazy Loading
- Ridotte dipendenze
- Guard.
- grazie al @ngrx/router-store funziona perfettamente il time travel"
- history back del browser (esteso lo store @ngrx/router-store)
- i dati per la popUp/pagina vengono passati usando le rotte.
// azione per l'apertura di una nuova pagina
this.store$.dispatch(RouterStoreActions.RouterGo({
path: [....],
data // dati passati alla pagina di destinazione
}));
// azione specifica per l'apertura delle popUP
this.store$.dispatch(RouterStoreActions.RouterGoPopUp({
path: [....],
data // dati passati alla poUp di destinazione
}));
- per ogni route-outlet è possibile aprire una sola PopUp/pagina.
src/
|- app/
| |- core/
| | |- components/
| | |- directive/
| | |- interceptors/
| | |- models/
| | |- pipe/
| | +- utils/
| |- main/
| | |- components/
| | |- models/
| | |- services/
| | +- views/
| | | |- book/
| | | | |- ...
| | | | |- book-edit/ popUp per la modifica
| | | | |- ...
| | | |- coin/
| | | | |- ...
| | | | |- coin-edit/ popUp per la modifica
| | | | |- ...
| | | |- home/
| | | | |- ...
| | | | |- home-edit/ popUp per la modifica
| | | | |- ...
| |- root-store/ estensione dello store di @ngrx/router-store gestione delle rotte
| | |- router-store/
| | | |- ...
| | | |- pop-up-base.component.ts -> componente base per l'implementazione delle popUP
| | | |- ...
| | |- index.ts
| | |- root-reducer.ts
| | |- root-store.module.ts
| | |- selectors.ts
| | +- state.ts
| |- app.component.*
| |- app.module.ts
| |- app.routing.ts
| +- ...
+ ...
Attualmente sono presenti due route-outlet:
<router-outlet></router-outlet> // se non viene indicato, il valore predefinito di name è 'primary'
<router-outlet name='popUp'></router-outlet> // popUp
Se necessario è possibile estendere questo sistema per gestire ulteriori router-outlet
- azione:
// dati necessari alla pagina di destinazione
const data = {
name:'blablabal',
value:{a:1,q:2...},
...
};
this.store$.dispatch(RouterStoreActions.RouterGo({
path: ['home'],
data
}));
- store:
{
router: {
navigationId: 2,
extras: null,
primary: {
name:'blablabal',
value:{a:1,q:2...},
...
},
popUp: null
},
...
}
per accedere al dato:
this.store$.select(RouterStoreSelectors.selectPrimary);
- azione:
// dati necessari alla popUp di destinazione
const data = {
valuea:{},
valueb:{},
valuec:{},
blabla: '...',
};
this.store$.dispatch(RouterStoreActions.RouterGoPopUp({
path: ['home', {outlets: {left: ['edit']}}],
data
}));
- store:
{
router: {
navigationId: 2,
extras: null,
primary: { // primary resta popolato con i dati della pagina attualmente visualizzata
name:'blablabal',
value:{a:1,q:2...},
...
},
popUp: { // popUp assume il dato passato dall'azione 'RouterGoPopUp'
valuea:{},
valueb:{},
valuec:{},
blabla: '...',
}
},
...
}
per accedere al dato:
this.store$.select(RouterStoreSelectors.selectPopUp)