【问题标题】:Angular5 - @HostBinding instead of :hostAngular5 - @HostBinding 而不是 :host
【发布时间】:2018-05-03 20:15:14
【问题描述】:

我读到最好使用@HostBinding 而不是:host。所以我考虑改变我的component.ts

@Component({
    host: {
        'class': 'cover',
        '[class.uploading]': 'uploadProgress > 0',
    }
})

这很好用,但是当我将其更改为:

export class Cover {
    @HostBinding('class') classes = 'mark6-cover';
    @HostBinding('[class.uploading]') uploadProgress > 0;

    @Input() uploadProgress = null;
}

我收到错误,但没有任何效果。我在这里做错了什么?以及如何使变量 uploadProgress 成为可观察的?

【问题讨论】:

    标签: typescript angular5 angular2-hostbinding


    【解决方案1】:

    '[class.uploading]': 'uploadProgress > 0' 的对应项是:

    @HostBinding('class.uploading')
    @Input() 
    uploadProgress = null;
    

    uploadProgress 输入可以从可观察订阅或其他地方异步设置。

    uploading 类将被触发为真 uploadProgress,这可能是预期的行为。

    如果条件不同(例如输入值可以是负数,而一个类应该只为正值触发),可以添加额外的属性:

    @Input() 
    uploadProgress = null;
    
    @HostBinding('class.uploading')
    get isUploading() {
      return this.uploadProgress > 0;
    }
    

    如果条件复杂,组件最好有OnPush变化检测策略。

    【讨论】:

    • 谢谢,但这会覆盖@Input() uploadProgress = null;为什么我不能在那里设置像 > 这样的运算符?我现在尝试了!== null 但这也不适用于这个地方......我需要设置类只有当uploadProgress上有任何活动......并且我需要在进度完成后再次删除它。难道@HostBinding 根本不可能做到这一点?
    • 当然,那里也需要@Input。我添加了一些解释。希望这会有所帮助。
    • 我非常感谢你,但我无法让它工作。我尝试了您的底部代码示例,但是当我从外部添加一个虚拟值(如 33)时,仍然缺少类上传。我已经使用了changeDetection:ChangeDetectionStrategy.OnPush
    • 谢谢,现在可以了,我不知道为什么昨天不行。也许累了 ;) 所以你可以确认 @HostBinding 比 :host 更有活力?
    • 这是一个品味问题。我总是使用 HostBinding,它更具表现力。您也可以在子类 IIRC 中继承它。
    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2020-05-06
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    相关资源
    最近更新 更多