【问题标题】:How to use Observable correctly in a list?如何在列表中正确使用 Observable?
【发布时间】:2016-08-08 23:16:12
【问题描述】:

我正在使用 Angular 2。

当我只有一个元素时,我可以先使用nativeElement,然后再使用Observable

<div #aaa></div>

@ViewChild('aaa') private aaa: ElementRef;
ngAfterViewInit() {
  console.log(Observable.fromEvent(this.aaa.nativeElement), 'mouseenter');
}

但是现在我有一个列表,我不能用同样的方法来做:

<a *ngFor="#user of users" #aaa (mouseenter)="mouseEnter($event, user)">
  {{user}}
</a>

@ViewChild('aaa') private aaa: ElementRef;
ngAfterViewInit() {
  console.log(Observable.fromEvent(this.aaa.nativeElement), 'mouseenter');
}

它会显示错误:

异常:TypeError:无法读取 null 的属性“nativeElement”

当鼠标移入每个元素时,我希望它使用 Observable 做不同的事情。在这种情况下如何正确使用 Observable?

【问题讨论】:

  • @ViewChildren('aaa') hrefs: QueryList;
  • 并在 ngAfterViewInit 中:this.hrefs.toArray().forEach((child) => console.log(Observable.fromEvent(child.nativeElement, 'mouseenter')));
  • @yurzui 感谢您的帮助!

标签: typescript angular rxjs rxjs5


【解决方案1】:

就如何在此处尝试做的事情而言,我建议:

@Component({
  template: `
    <a *ngFor="#user of users" (mouseenter)="mouseEnters$.next({event: $event, user: user})">
    {{user}}
  </a>
  `
})
class YourComponent { 
   mouseEnters$: Subject<data:{event: MouseEvent, user: any}> = BehaviorSubject.create();

   ngAfterViewInit(){ //you don't actually need to wait for afterViewInit anymore
       this.mouseEnters$.subscribe((data:{event:MouseEvent, user: any}) => /* do whatever */)
   }
}

就你得到异常的原因而言 - 你不能将模板变量放在带有ngFor 的元素上(当你意识到元素重复时这是有道理的...... ),因此@ViewChild 为空。

【讨论】:

  • 你能解释一下为什么我们不能用 *ngFor 添加局部变量吗?
  • @PardeepJain 因为该元素将被重复 n 次(其中 n 是您的用户列表的大小)。 aaa 会是哪些元素?
  • 那么在这种情况下,局部变量是什么? *ngFor 或其他东西的索引?
  • 没有局部变量,从某种意义上说(我认为)你正在考虑它。这相当于动态创建它们,which is explicitly not supported。我上面提到的情况是假设的——你实际上不能这样做。
  • 不过我可能误解了你 - 你想做什么?
【解决方案2】:

这取决于你以后想用usereventObservableViewChild 做什么似乎有点过头了,就这样吧:

<a *ngFor="#user of users" #aaa (mouseenter)="mouseEnter($event, user)">
  {{user}}
</a>

mouseEnter(event, user) {
  console.log(event, user);
  //do smth. i.e. this.eventEmitter.emit(user);
}

【讨论】:

  • 在你理解它们之前,Observables 看起来有点矫枉过正。一旦你这样做了,你就会把它们当作一个原始类型——它们实际上是在 ng2 应用程序中。
  • ^^ 我之所以这么说,是因为不久前我还没有完全理解它们,也有同样的感觉。现在我这样做了,我更喜欢 angular2 很多
  • 好吧,我的回答指的是这个特定的问题,而不是一般可观察的。对于这种特殊情况,似乎不需要使用 observable。
  • 如果 OP 的用例实际上就像他们在此处发布的一样简单,那么您是对的。我认为可以肯定地假设他们只是发布了一个过于简化的 SSCCE。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
相关资源
最近更新 更多