Penso di avere avuto un dilemma simile, ed ecco come mi sto occupando di questo tipo di situazioni. Parametri
1. Obiettivo & ingresso
Quando voglio fare la scissione in una componente bambino dal componente principale cercherò di vedere se questo è un diverso tipo di oggetto di sistema oppure no (in pratica se io bisogno di un percorso completo per esso o posso risolvere il mio collegamento dati utilizzando solo una proprietà come bersaglio/ingresso) non dimenticare:
angolare insiste sul fatto che si dichiara una proprietà target per essere un proprietà di input. In caso contrario, Angular rifiuta l'associazione e genera un errore .
recensione part3 da NG2 tutorial: https://angular.io/docs/ts/latest/tutorial/toh-pt3.html
1. Routing
Per i componenti che si possono definire un nuovo percorso e quindi ottenere i dati in che utilizzando due metodi:
1.1. Dai parametri route e un servizio (è necessario utilizzare un metodo di servizio per il caricamento dei dati, in questo modo è possibile refactoring l'accesso ai dati e mantenere il componente snello e focalizzato sul supporto della vista). Dovrebbe utilizzare i parametri del percorso solo per i filtri o le attività di piccoli lavori e non per i trasferimenti di dati. Ecco una possibile componente:
Object1Routes
import { RouterConfig } from '@angular/router';
import { Object1Dashboard } from './object1.dashboard';
import { Object1Edit } from './object1.edit';
export const Object1Routes: RouterConfig = [
{
path: 'object1',
component: Object1Dashboard,
'children': [
<...>
,{ path: 'edit/:id', component: Object1Edit }
]
}
];
Object1Edit
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { Object1Service } from './services/object1/object1.service';
import { Object1Model } from './models/object1/object1.model';
@Component({
selector: 'object1-edit',
templateUrl: './object1/object1.edit.html',
directives: []
})
export class Object1Edit implements OnInit, OnDestroy {
model = new Object1Model;
sub:any;
editId:number;
constructor(
private route: ActivatedRoute,
private router: Router,
private serviceData: Object1Service
) { }
onSubmit(d:Object1Model) {
this.model = d;
this.router.navigate(['/object1']);
}
ngOnInit() {
this.sub = this.route.params.subscribe(params => {
this.editId = +params['id']; // (+) converts string 'id' to a number
this.serviceData.getObject1ById(this.editId).then(data => {
this.model = data;
});
});
});
}
ngOnDestroy() {
this.sub.unsubscribe();
}
}
1,2. Proprio da un servizio
Object1Routes
import { RouterConfig } from '@angular/router';
import { Object1Dashboard } from './object1.dashboard';
import { Object1List } from './object1.list';
export const Object1Routes: RouterConfig = [
{
path: 'object1',
component: Object1Dashboard,
'children': [
{ path: '', component: Object1List }
<...>
]
}
];
Object1List
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { Object1Service } from './services/object1/object1.service';
import { Object1Model } from './models/object1/object1.model';
@Component({
selector: 'object1-list',
templateUrl: './object1/object1.list.html'
})
export class Object1List implements OnInit, OnDestroy {
constructor(
private route: ActivatedRoute,
private router: Router,
private serviceData:Object1Service
) { }
modelArray:Object1Model[];
selectedId:number;
private sub: any;
onSelect(model:Object1Model) {
console.log('Select ' + model.code);
let link = ['/object1/edit', model.id];
this.router.navigate(link);
}
onDelete(model:Object1Model) {
console.log('Delete : ' + model.code);
this.serviceData.delObject1ById(model.id);
}
ngOnInit() {
this.sub = this.route .params.subscribe(params => {
this.selectedId = +params['id'];
this.serviceData.getAllObject1().then(data => this.modelArray = data);
});
}
ngOnDestroy() {
if (this.sub) {
this.sub.unsubscribe();
}
}
}
Spero che questo vi aiuterà. Fammi sapere i tuoi pensieri, se hai un'opinione diversa o se ho perso qualcosa.
Il codice fornito è basato su Angular 2.0.0-rc.2 e @ angular/router 3.0.0-alpha.7.
controllare anche questo articolo sul Responsabilità unico principio: https://blog.8thlight.com/uncle-bob/2014/05/08/SingleReponsibilityPrinciple.html
Vorrei che i bambini raggiungessero il servizio e trasmettessero l'id ai bambini utilizzando un [route param] (https://angular.io/docs/ts/latest/guide/router.html#!#route -parametri) o [stringa di query/param] (https://angular.io/docs/ts/latest/guide/router.html#!#query-parameters). Se i dati sono piccoli, puoi semplicemente inserirli nella stringa di query. –