У меня есть элемент HTML, для которого мне нужно изменить атрибут стиля, используя [ngStyle]
. Для этого я создал переменную компонента с именем templateStyle
и установил для нее значение в пределах объекта, предоставленного созданной мной службой с именем componentStyles
, которая выглядит следующим образом:
base.component. ts
ngOnInit() {
// returns a nested object of styles from my database
var componentStyles = await this.styleService.componentStyles$.pipe(first()).toPromise();
// I check to see if the style I need to set exists on the object, if it does, I add it
this.templateStyle = {
'min-height': componentStyles.customAttributes.sectionHeight != null ? `${componentStyles.customAttributes.sectionHeight}px` : null;
}
}
Эта переменная templateStyle
присвоена моему div
примерно так:
<div [ngStyle]="templateStyle"></div>
Теперь вот проблема:
Пользователь может изменить свойство sectionHeight
, используя ползунок во всплывающем окне. Поэтому в моем всплывающем компоненте я получаю доступ к styleService.componentStyles$
, чтобы получить ссылку на объект стиля, а затем я могу изменить sectionHeight
в зависимости от значения ползунка следующим образом:
popup. component.ts in ngOnInit()
// call the same service to get reference to styles
var componentStyles = await this.styleService.componentStyles$.pipe(first()).toPromise();
this.slider.subscribe((change) => {
// emits current value of slider (from 1 to 100)
// this is the same property that is being assigned in the templateStyle variable in the
// base component
componentStyles.customAttributes.sectionHeight = change.detail.value;
})
Поскольку componentStyles
является объектом и передается по ссылке, фактическое значение данных действительно изменяется, НО это не вызывает запуск Angular обнаружение изменений в базовом компоненте, поскольку новый объект templateStyle
не переназначается (изменяется только значение componentStyles.customAttributes.sectionHeight
). Это приводит к тому, что объект [ngStyle]
не обновляется, а атрибут min-height
не изменяется.
Поскольку мой текущий контекст находится во всплывающем окне, как я могу принудительно проверить объект templateStyle
в моем базовом компоненте для проверки для изменений? Я понимаю, что могу сделать:
this.templateStyle = Object.assign({}, this.templateStyle)
, но ползунок находится в popup.component.ts и не имеет доступа к переменной templateStyle
в базовом компоненте.
Каков наилучший способ go по этому поводу?
Временное решение
Простой способ - просто назначить css непосредственно из объекта службы, например, так:
<div [ngStyle]="{
'min-height': `${componentStyles.customAttributes.sectionHeight}px`
}"
Этот работает , но он заставляет мой HTML выглядеть неряшливо, и я бы вместо этого установил вместо него переменную компонента , Спасибо!