【问题标题】:component vs directive event priority组件 vs 指令事件优先级
【发布时间】:2017-02-23 05:51:15
【问题描述】:

我编写了一个指令,它只接受实现ControlValueAccessor 的数字。

onBlur 的那个特定元素我会像下面这样更新它的模型。

@HostListener('blur',['$event']) onBlur(event) {
    this.directiveModel = this.getOnlyNumberLogic();
    this.propagateChange(this.directiveModel); <-- update model
    this.renderer.setElementProperty(this.el.nativeElement, 'value', this.directiveModel);
  }

上述逻辑完美运行,但是当我在组件元素的 HTML 中添加(blur) 时出现问题,如下所示:

<input type="text" name="number"
    #numberId="ngModel"
    required
    [(ngModel)]="obj.number"
    pattern="^\d{11}(?:\d{5})?$"
    numberOnly   <---- Directive
    (blur)="numberId.valid && onNumberBlur(numberId.value)"
    maxlength="16"/>

每次组件的(blur)首先执行,然后指令的@HostListener('blur'),因此[(ngModel)]没有更新,因为this.propagateChange()在指令的blur中,稍后调用。

问题:

有没有设置指令的模糊应该首先执行的优先级?

【问题讨论】:

    标签: angular typescript components angular2-directives


    【解决方案1】:

    我用EventEmitter 解决了上述问题。我有一个 EventEmitter 用于指令:

    @Output() onDirectiveBlur = new EventEmitter();

    然后在指令的模糊中我会发出这个事件,

    @HostListener('blur',['$event']) onBlur(event) {
      this.directiveModel = this.getOnlyNumberLogic();
      this.propagateChange(this.directiveModel); <-- update model
      this.renderer.setElementProperty(this.el.nativeElement, 'value', this.directiveModel);
      this.onDirectiveBlur.emit();
    }
    

    与组件的 HTML 中的元素绑定,如下所示:

     <input type="text" name="number"
        #numberId="ngModel"
        required
        [(ngModel)]="obj.number"
        pattern="^\d{11}(?:\d{5})?$"
        numberOnly   <---- Directive
        (onDirectiveBlur)="numberId.valid && onNumberBlur(numberId.value)"
        maxlength="16"/>
    

    在这种情况下,组件的(自定义)blur 只会在指令的blur 之后调用,并保证模型将始终更新。

    我不接受这个作为答案(目前),因为我觉得有比包含事件onDirectiveBlur 更好的方法,让我知道你的想法。

    【讨论】:

    • 请注意,请不要使用new EventEmitter&lt;any&gt;(); 使用new EventEmitter();,后者更安​​全,也更易于阅读。很多时候人们陷入了这样的陷阱:因为--noImplicitAny 很好,所以明确的anys 也可以。他们是最后的手段。请不要养成随他们乱扔代码的习惯,因为这会让您和他人的生活变得痛苦
    • 对不起,我对这个话题有点激动;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2011-08-17
    • 1970-01-01
    • 2016-04-10
    相关资源
    最近更新 更多