Вы также можете использовать @Input
и @Output
, как описано ниже:
@Component({
selector: 'custom',
template: `
<div>
{{value}} - <span (click)="updateValue()">Update</span>
</div>
`
})
export class CustomComponent {
@Input()
value:string;
@Output()
valueChange:EventEmitter;
constructor() {
this.valueChange = new EventEmitter();
}
updateValue() {
this.valueChange.emit('other value');
}
}
Таким образом, экземпляр, который вы привязаны к значению пользовательского компонента будет использовать двухстороннее связывание. Когда updateValue
вызывается в пользовательский компонент, соответствующее свойство (здесь someProperty
) будет также обновляться в родительском компоненте:
@Component({
(...)
template: `
<custom [(value)]="someProperty"></custom>
`,
directives: [ CustomComponent ]
})
export class MyComponent {
someProperty:string;
constructor() {
this.someProperty = 'test';
}
}
Вот соответствующая plunkr: https://plnkr.co/edit/ubtMXpGefgybGK4A3Pho?p=preview.
Я думаю, что существует много кода для выполнения такой простой вещи. Разве нет лучшего способа? Чтобы написать кучу @Output и updateThis, updateThat методы для каждого двухстороннего ограниченного свойства далеко не хороши, вам не кажется? – user1685095
Фактически, я описал способ определения двусторонней привязки для компонентов. Это работает для всех типов объектов даже примитивных типов. Подход Angular2 заключается в том, чтобы определить четкий «контракт» для компонентов: что они принимают за параметры (ввод) и то, что они могут запускать (выводить). Тем не менее, вы всегда можете указать параметр и работать по ссылке. Это позволяет не определять/обрабатывать 'EventEmitter', но это не работает для примитивных типов ... –
вы можете привести пример« предоставить параметр и работать по ссылке »? Кроме того, я изменил свой код и реализовал двустороннюю привязку через Input и Output, как вы предложили. Теперь, когда я вижу изменения сущности в рекурсивном элементе, я не вижу их в AppComponent – user1685095