Angular 2 RxJS检查鼠标事件在延迟后是否仍处于活动状态

Angular 2 RxJS检查鼠标事件在延迟后是否仍处于活动状态,angular,rxjs,rxjs5,Angular,Rxjs,Rxjs5,我用Angular 2来做指令。我已将以下事件绑定到主机组件: host: { '(mouseenter)': 'onMouseEnter($event)', '(mouseleave)': 'onMouseLeave($event)' } 我还在指令上创建了两个流和侦听器来管理这两个事件 export class PopupDirective { private _mouseEnterStream: EventEmitter<any> = new Even

我用Angular 2来做指令。我已将以下事件绑定到主机组件:

host: {
    '(mouseenter)': 'onMouseEnter($event)',
    '(mouseleave)': 'onMouseLeave($event)'
}
我还在指令上创建了两个流和侦听器来管理这两个事件

export class PopupDirective {
    private _mouseEnterStream: EventEmitter<any> = new EventEmitter();
    private _mouseLeaveStream: EventEmitter<any> = new EventEmitter();

    onMouseEnter($event) {
         this._mouseEnterStream.emit($event);
    }

    onMouseLeave($event) {
         this._mouseLeaveStream.emit($event);
    }
}
有Angular 2/RxJS经验的人知道我应该如何处理这个问题吗?

看起来很像

this.myStream=this.\u mouseEnterStream
.flatMap((e)=>{
可观测回波
。of(e)
.延迟(2000年)
.takeUntil(mouseLeaveStream);
});
myStream.subscribe((x)=>{
log('onNext:',x);
});

我自己不使用TS或Rx(仅Dart),因此我不知道这是否是正确的语法,也不知道操作符的名称是否与Angular可用的名称匹配。

居里者的答案正是您所期望的,但您应该使用
of
操作符,而不是
返回的
操作符

this._mouseEnterStream.flatMap((e) => {
  console.log('_mouseEnterStream.flatMap');
  return Observable
      .of(e)
      .delay(2000)
      .takeUntil(this._mouseLeaveStream);
}).subscribe(
  (e) => {
    console.log('yay, it worked!');
    console.log(e);
  }
);
请参阅相应的plunkr:


另外,还有一个目标是简化通过模板语法使用Rx从DOM事件创建可观察对象的方式。

这是哪里的
。_mouseStream
来自哪里?@GünterZöchbauer抱歉,这应该是mouseEnterStreambtw,因为您使用Rx,所以您真的不需要EventEmitter。只需使用主题即可。有点惊讶你可以使用EventEmitter作为可观察对象,也许ng2会在引擎盖下转换它们。@Kakigori不是EventEmitter是可观察对象的全部要点吗?不过感谢您的提示。通常,要在其他项目中使用EventEmitter进行观察,您必须使用static
fromEvent
方法从事件发射器生成观察。我曾经是事件发射器的大量用户,但是冷/热流、操作符以及整个创建/订阅/处理都太好了。(您可能会发现Andre在这里的帖子很有用:)如果您只想返回一个值,
。只返回
更有意义。但对于非Haskelly lang用户来说,这可能是胡言乱语。感谢您的评论,但Rxjs 5.0.0-beta.0中不存在此运算符。查看此错误:
Rx_1.Observable.just不是一个函数
噢,抱歉,看起来它在RxJS5测试版的迁移文档中列出了。虽然有点悲哀。不确定为什么
.subscribe
需要连接到
.flatMap
才能工作,但这太完美了!谢谢。这只是为了创建数据流。当接收到第一个事件时,它将映射到另一个处理延迟的链…有趣的是,我在发布此帖子之前就尝试了此选项-但出于某种原因。susbcribe需要连接到.flatMap才能使其工作-否则,鼠标事件会立即触发“下一步”。
this._mouseEnterStream.flatMap((e) => {
  console.log('_mouseEnterStream.flatMap');
  return Observable
      .of(e)
      .delay(2000)
      .takeUntil(this._mouseLeaveStream);
}).subscribe(
  (e) => {
    console.log('yay, it worked!');
    console.log(e);
  }
);