javascript - 宿主组件改变子组件的行为
问题描述
假设我有以下组件Child
。
@Component({...})
class Child {
@Input() mySpecialFlag: boolean;
}
Child
可以用作独立组件,也可以由Special
组件包装,该组件“限定” Child
. Child
单独使用时,用户可以选择设置为[mySpecialFlag]
true 或 false。当Child
在 内使用时Special
,我希望Special
组件通过以下方式强制输入[mySpecialFlag]
为真:
@Component({...})
class Special {
@ContentChild(Child) child;
...
ngAfterContentInit() {
this.child.mySpecialFlag = true;
}
}
上面的问题是它设置[mySpecialFlag]
得太晚了。我希望能够在孩子的任何生命周期方法运行之前或至少在孩子的生命周期方法运行之前将此标志设置为 true ngAfterContentInit
。这可能吗?
解决方案
在父组件中设置标志ngOnInit
似乎有效:该标志是ngOnInit
在子组件之前设置的。
ngOnInit() {
this.child.mySpecialFlag = true;
}
请参阅此 stackblitz以获取演示。
尽早访问子组件的另一种方法是将@ContentChild
装饰器与 getter/setter 属性相关联,并在 setter 中设置子标志:
export class ParentComponent {
private _child: ChildComponent;
@ContentChild(ChildComponent) get child(): ChildComponent {
return this._child;
}
set child(val: ChildComponent) {
this._child = val;
this._child.mySpecialFlag = true;
}
}
请参阅此 stackblitz以获取演示。请注意,_child
设置标志不需要私有变量和 getter。我添加了它们以防您出于其他目的需要引用子组件。
推荐阅读
- python - 如何在 python Selenium 中将“send_keys”发送到文本区域
- c - Segmentation Fault 11 - 在 C 中的文件中查找单词
- oracle - 将多行电话数据合并为显示开始和结束日期的单行的脚本
- javascript - 每次移除 DOM 元素之前移除事件
- image - Flutter - 如何仅将图像的黑色着色,而不接触透明或白色部分?
- swift - 如何将 UIView 的位置设置为与按钮相同
- reactjs - React Native - 尝试取消订阅侦听器时出错
- java - 在 Fragment 中实现接口
- graphviz - 如何在graphviz中制作一个从外部节点到内部节点的图?
- python - 使用内联和非内联块时的 Jinja2 缩进