Как я могу сделать вход видимым?
У меня есть компонент с несколькими входами, которые я бы хотел получить, когда он изменится. В настоящее время я работаю, реализуя ngOnChanges
и выясняя, какой вход был изменен. Тем не менее, я бы предпочел включить мое объявление ввода в @Input('select-values') selectValues:Observable<any>
. Это позволило бы мне подписаться на любые новые изменения, которые происходят более чистым способом.
ngOnInit() {
this.selectValues.subscribe(() => console.log('yay!'));
}
Проблема с этим в том, что я получаю исключение TypeError: this.selectValues.subscribe is not a function
.
Просто выяснилось, что это тоже работает -
Взаимодействие компонентов. Изменяется входное свойство перехвата с установщиком.
Ответы
Ответ 1
Вы можете обернуть их в форму и прослушать изменения
this.myForm = fb.group({
'sku': ['', Validators.required]
});
this.sku = this.myForm.controls['sku'];
this.sku.valueChanges.subscribe(
(value: string) => {
console.log('sku changed to: ', value);
}
);
this.myForm.valueChanges.subscribe(
(value: string) => {
console.log('form changed to: ', value);
}
);
http://blog.ng-book.com/the-ultimate-guide-to-forms-in-angular-2/
или
@Component({
...,
template: '<input (change)="onChange($event.target.value)">'
})
class MyComponent {
this.inputChange =new Subject();
onChange(e) {
this.inputChange.next(e);
}
}
См. также эту проблему open https://github.com/angular/angular/issues/4062
Ответ 2
На самом деле, невозможно напрямую зарегистрировать на наблюдаемые элементы, связанные с событиями для элементов DOM. Вам нужно напрямую ссылаться на элемент DOM и использовать метод fromEvent
Observable
.
Вот пример:
@Component({
(...)
template: `
<input #input />
`
})
export class SomeComponent {
@ViewChild('input')
input:ElementRef;
ngAfterViewInit() {
var eventObservable = Observable.fromEvent(
this.input.nativeElement, 'keyup');
}
}
Этот вопрос может вас заинтересовать:
Тем не менее, вы можете использовать средства управления формой, чтобы получать уведомления при обновлении значения ввода. Атрибут valueChanges
элемента управления может быть передан как вход субкомпонента.
@Component({
(...)
template: `
<input [ngFormControl]='ctrl'/>
<child-component [select-values]="ctrl.valueChanges"></child-component>
`
})
export class SomeComponent {
constructor() {
this.ctrl = new Control();
this.ctrl.valueChanges.subscribe(...);
}
}