首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Angular:@Output EventEmitter订阅

Angular:@Output EventEmitter订阅
EN

Stack Overflow用户
提问于 2019-06-03 17:27:03
回答 2查看 3.3K关注 0票数 1

我编写了一个带有@Output EventEmitter属性的指令:

代码语言:javascript
运行
复制
@Directive({
    selector: '[ifValid]'
})
export class SubmitValidationDirective {

    @Output('ifValid') valid = new EventEmitter<void>();

    constructor(
        private formRef: NgForm
    ) {}

    @HostListener('click')
    handleClick() {
        this.emitIfValid();
    }

    private emitIfValid() {
        if (this.formRef.valid) {
           this.valid.emit();
        }
    }

}

所以,我是这样使用的:

代码语言:javascript
运行
复制
<button (ifValid)="save()">

那么,在我的组件中:

代码语言:javascript
运行
复制
private save() {
    this.service.push(this.user, this.toCreate)
       .pipe(
           take(1)
       )
       .subscribe();
}

手动订阅让我觉得很烦人。

我希望在ifValid提升时,添加这个运算符-类似于switchMap(() => this.service.push(...))

我想知道是否可以通过超文本标记语言订阅ifValid。我的意思是,我可以在我的组件中订阅ifValid吗?

我希望我已经解释得很好。

EN

回答 2

Stack Overflow用户

发布于 2019-06-03 17:34:51

您可以在组件中使用@ViewChield(SubmitValidationDirective) component;,然后可以使用

代码语言:javascript
运行
复制
this.component.valid.subscribe(() => {this.service.push(this.user, this.toCreate)
       .pipe(
           take(1)
       )
       .subscribe();
});

但是你必须输入unsubscribe(),比如你的ngOnDestroy

票数 0
EN

Stack Overflow用户

发布于 2019-06-03 17:37:46

是的,您可以这样做,因此我们需要创建一个服务,并在该服务上声明@Output

SharedService

代码语言:javascript
运行
复制
@Output('ifValid') valid = new EventEmitter<void>();

componentOne

代码语言:javascript
运行
复制
ngOnInit() {
this.sharedService.valid.subscribe(resp => {
     this.save()
});
}

private save() {
    this.service.push(this.user, this.toCreate)
       .pipe(
           take(1)
       )
       .subscribe();
}

指令或组件

代码语言:javascript
运行
复制
import { SharedService } from 'Sharedservice';

@Directive({
    selector: '[ifValid]'
})
export class SubmitValidationDirective {
    constructor(private sharedService: SharedService) { }
    @Output('ifValid') valid = new EventEmitter<void>();

    constructor(
        private formRef: NgForm
    ) {}

    @HostListener('click')
    handleClick() {
        this.emitIfValid();
    }

    private emitIfValid() {
        if (this.formRef.valid) {
          this.sharedService.valid.emit(null);
        }
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56424480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档