Angular 角度组件:我可以使用可观察的EventEmitter代替@Output()属性吗?

Angular 角度组件:我可以使用可观察的EventEmitter代替@Output()属性吗?,angular,rxjs,eventemitter,Angular,Rxjs,Eventemitter,[第2.4.5条] 我试过了,它似乎像一个事件发射器: 我的组件来自外部: 组件内部: @Output()VisibleTransitionId:可观察 观察员:观察员; 构造函数(){ const myObs=新的可观察对象(observer=>this.observer=observer); this.visibleTransitionEnd=myObs .map(x=>'>'+x+'EventEmitter只是扩展了Subject,所以这并不奇怪(我在Dart中也看到了这一点) 他们

[第2.4.5条]

我试过了,它似乎像一个事件发射器:

  • 我的组件来自外部:

    
    
  • 组件内部:

    @Output()VisibleTransitionId:可观察
    观察员:观察员;
    构造函数(){
    const myObs=新的可观察对象(observer=>this.observer=observer);
    this.visibleTransitionEnd=myObs
    
    .map(x=>'>'+x+'
    EventEmitter
    只是扩展了
    Subject
    ,所以这并不奇怪(我在Dart中也看到了这一点)

    他们使用自己的类,以便以后能够在不破坏现有代码的情况下修改实现


    因此,避免这种抽象可能不是最好的办法。如果你意识到缺点并愿意接受它,你当然可以这样做。

    好吧,在你的情况下,你可以使用
    EventEmitter
    Subject
    。你可以看到
    EventEmitter
    就像
    Subject
    (尽管建议尽可能使用
    EventEmitter

    Observable.create
    (或
    new Observable()
    )不打算这样使用。内部函数应该向观察者发出值并返回一个分解函数(释放资源或其他)。不作为属性保留。
    但是,我不确定它可能会产生什么后果(内存泄漏?)

    因此,请使用
    主题

    导出类SplitComponent实现OnDestroy{
    @Output()VisibleTransitionId:可观察
    visibleTransitionEndObserver:主题;
    构造函数(){
    常量主题=新主题();
    this.visibleTransitionEnd=subject.asObservable()
    
    .map(x=>'>'+x+'2个选择EventEmitter的原因

  • Angular
    EventEmitter
    可以确保在需要时异步交付事件。这有利于响应用户体验
  • 封装underline实现。如果有一天,Angular的下一个版本将更新事件绑定,该绑定依赖于
    EventEmitter
    的一些新内容。如果
    主题
    被广泛使用,这将是项目的灾难。对此不确定。但应该避免
  • Angular
    EventEmitter
    扩展了RxJS
    Subject
    到目前为止只有3种方法:1)
    constructor()
    ,2)
    subscribe(下一步,错误,完成)
    和3)新方法
    emit(值){super.next(值);}

    如果您
    新建EventEmitter(true)
    ,它将异步传递事件

    构造函数(isAsync=false){
    超级();
    这个。uu isAsync=isAsync;
    }
    

    EventEmitter.subscribe()
    根据
    这一点对async传递事件做了一些事情。\u isAsync

    我想指出使用Observable for output接口的一个优点是 你基本上可以加入任何你想要的可观察到的东西

    因此,假设您有一个事件,该事件只有在表单有效并传递值时才会触发

    对于事件发射器,您必须定义额外的发射器实例来处理它

    @Output validValue = new EventEmitter()
    this.form.valueChanges.pipe(tap(value=>{
    if(ths.form.valid) 
       validValue.emit(value)
    })).subscribbe()
    
    使用Observable作为事件发射,您可以简单地做到这一点

    @Output() validValue=this.form.valueChanges.pipe(filter(_=>this.form.valid))
    

    thx,我已经更新了我的plunker的以下答案,它与
    主题
    配合得很好,没有添加
    可观察的
    操作符,为什么要添加它?@bertrandg看到了,你知道它是否可以使用。publishReplay/publish+refCount并将其标记为@Output?我不知道,但应该不难找到。打开了一个功能请求以一种未来安全的方式将可观察对象公开为输出属性:可能重复