【问题标题】:Angular 4 : Access attribute directive from hostAngular 4:从主机访问属性指令
【发布时间】:2018-09-26 00:05:43
【问题描述】:

考虑以下代码:

 <button cdtSaving type="submit" class="btn btn-default" [disabled]="!canSave()">Save</button>

用 cdt 保存一个属性指令:

@Directive({
  selector: '[cdtSaving]'
})
export class SavingDirective implements OnInit, OnDestroy {

  private subscription: Subscription;

  constructor(private _loaderService: LoaderService, private _elRef: ElementRef, private _renderer: Renderer2) { }

  ngOnInit() {
    // subscribe to the service state to hide/show the loader
    this.subscription = this._loaderService.loaderState
      .subscribe((state: LoaderState) => {
        this._renderer.setAttribute(this._elRef.nativeElement, 'disabled', state.show ? 'true' : null);
        console.log(`state changed:${state.show} for element ${this._elRef.nativeElement.textContent}`);
      });
  }

  ngOnDestroy() {
    // unsubscribe
    this.subscription.unsubscribe();
  }
}

基本上每当调用可观察的 next() 时,我们都会启用或禁用按钮 (nativeElement)。

问题是当设置disabled属性为null时,canSave方法就不再考虑了。

因此,我想在指令中将标志设置为真/假,而不是设置禁用属性,然后我会像这样读取该标志:

 <button cdtSaving type="submit" class="btn btn-default" [disabled]=" cdtSaving.myFlag || !canSave()">Save</button>

目前 cdtSaving.myFlag 不起作用,但也许有办法用 Angular 来实现?

【问题讨论】:

    标签: angular angular2-directives


    【解决方案1】:

    如果要访问指令内部状态,需要在@Directive()装饰器中设置exportAs元数据。

    也不需要使用ElementRefRendererdisabled 属性进行命令式管理。只需使用 @HostBinding 装饰器即可。

    import {Directive, Input} from '@angular/core';
    
    @Directive({
      selector: '[cdtSaving]',
      exportAs: 'cdtSaving'
    })
    export class SavingDirective {
      myFlag = false
    }
    

    用法:

    <button cdtSaving  #dir="cdtSaving" [disabled]="dir.myFlag">Save</button>
    

    【讨论】:

    • 感谢语法提示,这样看起来更整洁。但是它并不能解决我的问题。首先,如果您执行this.disabled = state === 'show',该按钮将始终被禁用。相反,它应该是this.disabled = state === 'show' ? 'true' : null,其中disabled 是一个字符串而不是布尔值。但是,我又回到了我的问题,即一旦 disabled 被指令覆盖,canSave 方法就不再被考虑在内。
    • 查看我的编辑,也请支持我的回答,因为我们的对话很愉快:) @HostBinding() 现在考虑了[disabled] 输入和loaderService 发出的值。
    • 也许我需要更明确地说明我想要实现的目标。当 loaderState 返回 true 时,该按钮应该被 cdtSaving 指令禁用。但是,当 loaderState 返回 false 时,应通过 canSave 方法禁用该按钮(直接绑定在 HTML 中)。我看不出您编辑的代码如何解决该问题。我错过了什么吗?感谢您的帮助!
    • 只要指令修改了 disabled 属性,这将永远不会起作用。 canSave() 方法(哪些代码不应在指令中)将始终被删除并替换为 null 或 true。相反,我正在寻找一种方法来从按钮的 disabled 属性访问指令的 disabled 属性(如 OP 中所述)。我不确定这是否可行,但这似乎是实现我想要的唯一方法。
    • 这正是我想要的!我不知道 exportAs 元数据。我已经实施了更改,并且按预期工作。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2017-06-18
    • 2012-08-08
    • 2016-10-26
    • 2019-11-23
    • 1970-01-01
    • 2018-02-11
    • 2019-02-21
    • 2014-02-01
    相关资源
    最近更新 更多