如何使输入可观察?

时间:2016-04-08 12:52:34

标签: angular

我有一个带有一些输入的组件,我希望在它发生变化时得到通知。我目前通过实施ngOnChanges并确定哪些输入已更改来工作。但是,我更希望将我的输入声明设置为@Input('select-values') selectValues:Observable<any>。这将允许我订阅以更清洁的方式发生的任何新变化。

ngOnInit() {
    this.selectValues.subscribe(() => console.log('yay!'));
}

问题是我得到例外TypeError: this.selectValues.subscribe is not a function

刚刚发现这也有效 - Component Interaction. Intercept input property changes with a setter

3 个答案:

答案 0 :(得分:20)

您可以将它们包装在表单中并聆听更改

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

答案 1 :(得分:13)

事实上,不可能直接注册与DOM元素事件相关的可观察对象。您需要直接引用DOM元素,然后使用fromEvent的{​​{1}}方法。

以下是一个示例:

Observable

这个问题也会引起你的兴趣:

这就是说,当输入值更新时,您可以利用表单控件进行通知。控件的@Component({ (...) template: ` <input #input /> ` }) export class SomeComponent { @ViewChild('input') input:ElementRef; ngAfterViewInit() { var eventObservable = Observable.fromEvent( this.input.nativeElement, 'keyup'); } } 属性可以作为子组件的输入传递。

valueChanges

答案 2 :(得分:6)

如果您只需要观察单个输入,则可以快速执行:

组件中的

ngOnInit() {
  this.searchField = new FormControl();
  this.searchField.valueChanges.subscribe(term => {
    console.log('searching for', term);
  });
}

in html:

<input type="search" [formControl]="searchField">

并且可能取消订阅ngOnDestroy。

相关问题