Prima ho creato una classe User
:Come utilizzare il collegamento dati bidirezionale tra i componenti in Angular 2?
export class User {
name: string;
email: string;
}
Poi ho ottenuto il mio CoreComponent
che utilizza il FormInputComponent
così come la creazione di un public user
dalla classe User
:
import {Component} from 'angular2/core';
import {FormInputComponent} from '../form-controls/form-input/form-input.component';
import {User} from '../core/user';
@Component({
selector: 'core-app',
templateUrl: './app/assets/scripts/modules/core/core.component.html',
styleUrls: ['./app/assets/scripts/modules/core/core.component.css'],
directives: [FormInputComponent]
})
export class CoreComponent {
public user: User = {
name: '',
email: ''
}
}
Poi ho' abbiamo creato un componente di input, che è un componente di input riutilizzabile che assumerà un valore di modello come input e quando vengono apportate modifiche esporta il nuovo valore in modo che CoreComponent
possa aggiornare il modello con il nuovo valore:
import {Component, Input, Output, EventEmitter, DoCheck} from 'angular2/core';
@Component({
selector: 'form-input',
templateUrl: './app/assets/scripts/modules/form-controls/form-input/form-input.component.html',
styleUrls: ['./app/assets/scripts/modules/form-controls/form-input/form-input.component.css'],
inputs: [
'model',
'type',
'alt',
'placeholder',
'name',
'label'
]
})
export class FormInputComponent implements DoCheck {
@Input() model: string;
@Output() modelExport: EventEmitter = new EventEmitter();
ngDoCheck() {
this.modelExport.next(this.model);
}
}
modello s' The CoreComponent
utilizza due FormInputComponent
s e passa user.name
e user.email
come ingresso per loro:
<form-input [model]="user.name" type="text" name="test" placeholder="This is a test" alt="A test input" label="Name"></form-input>
<form-input [model]="user.email" type="email" name="test" placeholder="This is a test" alt="A test input" label="Email"></form-input>
<pre>{{user.name}}</pre>
Il modello FormInputComponent
:
<div>
<label attr.for="{{name}}">{{label}}</label>
<input [(ngModel)]="model" type="{{type}}" placeholder="{{placeholder}}" alt="{{alt}}" id="{{name}}">
</div>
<pre>{{model}}</pre>
Ora il problema è che Posso vedere solo le modifiche dall'elemento pre
che si trova all'interno dello FormInputComponent
modello, ma l'elemento genitore, , pre
rimane invariato.
Ho guardato allo this question che si trova nel campo da baseball di ciò che voglio ottenere ma non abbastanza da quando usare un servizio per restituire un valore nella gerarchia sembra eccessivo e un po 'caotico se si dispone di più FormInputComponent
s sullo stesso pagina.
Quindi la mia domanda è semplice, come posso passare un modello per FormInputComponent
e lasciandolo restituire un nuovo valore ogni volta che il valore cambia in modo che il public user
in CoreComponent
cambia automaticamente?
Quindi la mia soluzione non funzionava perché non avevo() in [modello]? Sai anche un modo migliore di dire quando l'input cambia rispetto all'utilizzo di ngDoCheck? Ho controllato ngOnChanges ma sembra funzionare solo se è vincolante per gli oggetti o qualcosa del genere? – Chrillewoodz
E anche il nome del tuo input ;-) Puoi sfruttare l'evento ngModelUpdate sul tuo input: –
Cool Funziona! Sembra che ngDoCheck sia orribile per le prestazioni, perché stavo soffrendo per il fatto che il server si disconnetteva tutto il tempo anche solo con due ingressi. Ma una volta rimosso tutto scorre liscio, strano. Grazie mille per il tuo aiuto! – Chrillewoodz