Использование Angular @HostBinding внутри директивы для установки и обновления значений атрибутов на хосте

Итак, допустим, у меня есть следующая директива:

<div foo></div>

import { Directive, HostBinding } from '@angular/core';

@Directive({
    selector: '[foo]'
});

export class FooDirective {
    x: number;

    constructor() {
        this.x = 100;
    }

    @HostBinding('style.left.px')
    styleLeftPx: number = this.x;
}

Если я сделаю это как есть, то это не сработает, потому что this.x получает свое значение после @HostBinding инициализировал.

Итак, изменив вышесказанное на что-то вроде этого:

...

x: number = 100;

constructor() {}

...

И устанавливая это значение вне конструктора, значение добавляется без проблем.

Однако, если я попытаюсь изменить это значение в любой момент, например, с таймаутом:

...

x: number = 100;

constructor () {
    setTimeout(() => {
        this.x = 200;
    }, 2000)
}

...

Атрибут хоста не обновляется до нового значения. Не происходит ли привязка данных здесь после начальной инициализации? В стеке есть много ответов о том, как установить начальное значение атрибута с помощью @HostBinding, а как насчет изменения этого значения после init?

1 ответ

Я понял, где я иду не так.

Должно быть так:

<div foo></div>

import { Directive, HostBinding } from '@angular/core';

@Directive({
    selector: '[foo]'
});

export class FooDirective {
    @HostBinding('style.left.px')
    x: number = 100;

    constructor() {
        setTimeout(() => {
            this.x = 200;
        }, 2000); 
    }
}

Похоже, я неправильно понял синтаксис этого подхода.

Другие вопросы по тегам