Контекст
Бизнес-компонент A зависит от бизнес-службы, которая говорит либо:
A передать эти знания (вычисление, а не сохраненное значение) через одностороннюю привязку свойства к нескольким техническим дочерним компонентам B, которые определяют шаблон для сворачиваемого компонента (их содержимое является проекцией определенного c бизнес-компонента).
Когда A и B впервые отображаются привязки разрешаются, и B получают знания: сворачиваемые компоненты знают, должны ли они отображать свое содержимое или скрывать его. Тем не менее, они по-прежнему предоставляют кнопку для отображения или скрытия контента, если пользователь хочет.
Примечание: сворачиваемый компонент не внедряет сам сервис для непосредственного доступа к знаниям, потому что это бизнес-сервис и это технический компонент.
Проблема
После действия в A я хочу "повторно разрешить" привязку свойства с помощью B поэтому я хочу, чтобы A снова передавал знание сервиса в B и, таким образом, переопределял любые действия пользователя (например: если он открыл свертываемый компонент, который по умолчанию закрыт, я хочу он будет восстановлен в состояние по умолчанию, закрыто) * 1) Я не хочу, чтобы пользователь видел моргание, вызванное разрушением / рендерингом компонента.
2) За этим нет веской причины Эта проблема для повторной визуализации компонента.
Код
@Component({
selector: 'business-parent',
template: '
<generic-collapsable-component [opened]="businessHelper.conditionA">
// A business-child component
</generic-collapsable-component>
// More generic-collapsable-component
'
})
export class BusinessParentComponent {
constructor(private businessHelper: BusinessHelper) {
}
onBusinessAction() {
// Here I do some business stuff...
// And I want to force the binding [opened] to re-execute its default value, so I want GenericCollapsableComponent.opened = businessHelper.conditionA, and not what I currently have, which is the value of the last GenericCollapsableComponent.switch() I called.
}
}
@Component({
selector: 'generic-collapsable-component',
template: '
<button (click)="switch()">Switch to show or hide content</button>
<div [ngClass]="{'is-hidden': !isOpen()}"
<ng-content></ng-content>
</div>
'
})
export class GenericCollapsableComponent {
@Input() opened: boolean; // Is intialized by the parent component but can be modified by the inner switch() method called in the template.
constructor() {
}
switch(): void {
this.opened = !this.opened;
}
isOpen(): boolean {
return this.opened;
};
}
Решения
- Повторная визуализация компонента: NO.
- Привязка функции () => логическое к установите начальное значение и используйте другое частное логическое значение для ответа на действия пользователя: это то, что я сделал, и это работает, но это не идеально.