【问题标题】:How can I make an input observable?如何使输入可观察?
【发布时间】:2021-08-18 03:55:36
【问题描述】:

我有一个包含一些输入的组件,我希望在它发生更改时收到通知。我目前通过实现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.

【问题讨论】:

  • 这个问题不是关于输入属性的更改,而不是表单输入吗?如果是这样,那么我认为这两个答案都不应该被接受。我认为答案应该是您提供的食谱链接。

标签: angular


【解决方案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);
  }
}

另请参阅此问题打开https://github.com/angular/angular/issues/4062

【讨论】:

  • 又好又简单...:D
【解决方案2】:

事实上,不可能直接注册与 DOM 元素事件相关的可观察对象。你需要直接引用一个DOM元素,然后使用ObservablefromEvent方法。

这是一个示例:

@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(...);
  }
}

【讨论】:

【解决方案3】:

如果你只需要观察单个输入,你可以快速做到:

在组件中:

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

在 html 中:

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

也许在 ngOnDestroy 中取消订阅。

【讨论】:

  • 哦,这正是我想要的。为什么在其他任何地方都没有提到它这么容易。谢谢!
  • 值得注意的是,您不能单独使用 FormControl。您必须将其放在 FormGroup 中。
猜你喜欢
  • 2019-12-31
  • 1970-01-01
  • 2019-05-23
  • 2019-07-07
  • 2018-08-29
  • 2020-08-30
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
相关资源
最近更新 更多