【问题标题】:Using MatSelect with rxjs fromEvent events not being heard? (selectionChange)使用 MatSelect 和 rxjs fromEvent 事件没有被听到? (选择更改)
【发布时间】:2020-04-20 21:09:15
【问题描述】:

我正在尝试使用 rxjs fromEvent 从 MatSelect 获取值。我不能让它知道发生了一个事件。我让它与 MatInput 一起使用,因为我认为它继承了 Html 输入元素的默认行为,但 MatSelect 有所不同。

如果我将 mat-select 换成默认选择,则会拾取(更改)事件并按预期工作。 (更改)在 MatSelect 上的某个时候显然已被弃用,并且不再有效。

我尝试将模板 ID 移动到 mat-option 以查看它是否可以从那里获取事件,但没有运气。 试过: (改变) (选择) (选择更改) (值变化)


 @ViewChild('projectNameInput', {static: false, read: ElementRef}) projectNameInput: ElementRef;
 @ViewChild('pipelineSelect', {static: false, read: ElementRef}) pipelineSelect: ElementRef;
 @ViewChild('codeCoverageInput', {static: false, read: ElementRef}) codeCoverageInput: ElementRef;

 ngAfterViewInit() {
   // server-side search
   const projectObs$ = fromEvent(this.projectNameInput.nativeElement, 'keyup');
   const selectObs$ = fromEvent(this.pipelineSelect.nativeElement, 'onSelectionChange');
   const coverageObs$ = fromEvent(this.codeCoverageInput.nativeElement, 'keyup');

   const all$ = merge(projectObs$, selectObs$, coverageObs$)
     .pipe(
       debounceTime(300),
       distinctUntilChanged(),
       tap(() => {
         this.paginator.pageIndex = 0;
         this.loadSummariesPage();
       })
     )
     .subscribe();

   this.paginator.page
     .pipe(
       tap(() => this.loadSummariesPage())
     )
     .subscribe();
 }

------------------------------------

 <mat-form-field appearance="fill">
   <mat-label>types</mat-label>
   <mat-select name="type" [(ngModel)]="type">
     <mat-option #x *ngFor="let option of options" [value]="option.value">
       {{option.viewValue}}
     </mat-option>
   </mat-select>
 </mat-form-field>



【问题讨论】:

    标签: angular events rxjs angular-material


    【解决方案1】:

    如果您有Observable,如果您想接收流数据,则需要订阅它。

    在您的组件代码中,您需要以下内容:

    selectObs$.subscribe(selectedVal => console.log(selectedVal));
    

    注意:记得在OnDestroy组件事件中取消订阅,防止内存泄漏。


    更新

    1 - 在您的组件中,您应该绑定 matSelect 而不是 matOption。然后你可以听 selectionChange 发射器(就像一个 Observable):

     @ViewChild(MatSelect) select: MatSelect;
    

    模板中完全不需要#x。


    2 - 您是否尝试过从以下位置更改线路:

    const selectObs$ = fromEvent(this.pipelineSelect.nativeElement, 'onSelectionChange');
    

    const selectObs$ = fromEvent(this.pipelineSelect.nativeElement, 'selectionChange');
    

    我从未使用过 nativeElement 的事件,但 matSelect 有一个 EvenEmitter selectionChange: EventEmitter&lt;MatSelectChange&gt;,因此可能是命名不匹配。


    3- 使用 selectionChange 发射器:

    <mat-select name="type" [(ngModel)]="type">
         <mat-option #x (selectionChange)="onValueSelected()" *ngFor="let option of options" [value]="option.value">
           {{option.viewValue}}
         </mat-option>
     </mat-select>
    

    【讨论】:

    • 对不起,我忽略了,我确实订阅了它,我已经合并了三个 observables 并订阅了它。如前所述,如果我将 MatSelect 换成标准 select ,它就可以正常工作。
    • 对不起,我错过了那部分。您能否粘贴您的完整代码,或者至少您如何一起使用可观察对象和订阅?
    • 我已经尝试过了,但不幸的是它对我不起作用。我收到一个控制台错误,类似于无效的事件目标。
    • 你能创建一个简单的 stackblitz 示例吗?这样调试起来会更容易。
    • 我尝试了您上面的建议,创建了一个因 (selectionChange) 事件而被调用的方法,并从那里获取了值,然后我得到了我正在寻找的值。仍然希望能够通过 fromEvent 做到这一点,这让我得到了我现在想要的。感谢您的帮助。
    猜你喜欢
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多