angular - ViewChild 与输入/输出 - Angular 最佳实践
问题描述
在我看来,几乎在我们指定组件@Input
s/的所有情况下,我们@Output
都可以选择不使用任何@Input
s/ @Output
,而是直接使用它@ViewChild
来访问组件属性。例如,考虑以下两个可能的寻呼机 API:
选项 1:将当前页面和总页面公开为s,为下一个/上一个页面请求@Input
创建事件发射器 ( s)。@Output
<pager
[currentPage]="..."
[totalPages]="..."
(requestsNextPage$)="..."
(requestsPreviousPage$)="..."
></pager>
选项 2:为当前页面和总页面创建简单的属性,为下一个/上一个页面请求创建 observables/subjects 并通过@ViewChild
.
<pager></pager>
@ViewChild(PagerComponent)
pager: PagerComponent
pager.currentPage = ...
pager.totalPages = ...
pager.requestsNextPage$.subscribe(...)
pager.requestsPreviousPage$.subscribe(...)
我的问题是,如果这两种选择在大多数情况下同样可能,那么首选/最佳实践是什么?为什么?
解决方案
你描述的两种情况并不等同。
情况一:
<child [property]="value"></child>
子组件将使用“property = value”呈现,并且每当“value”更改时,子组件的视图将被更新(因为输入属性已更改)。
情况乙:
<child></child>
child.property = value;
子组件使用“property = value”(取决于此代码在生命周期中运行的时间)呈现,并且进一步的更改不会反映在子组件的视图中。
如果您只是设置一个永远不会改变的初始值,那么这两种情况可能是等效的。但是,这不太可能是您想要做的。Angular 在重用组件方面非常激进,它使用的标准之一是 @Input 属性。由于这种行为,我遇到了重用组件而不是删除和重新创建组件的麻烦,理解和调试可能会非常令人沮丧。
推荐阅读
- java - 为什么存储在 arrayList 中的每个对象的内容具有相同的值?
- javascript - 我不断收到此错误,这是我使用的代码。错误每个 then() 应该返回一个值或抛出
- bash - 如何使用管道命令创建屏幕
- php - php中通过curl发送数据的问题
- javascript - 如何在创建具有相似结构的新对象时递归迭代 JS 对象?
- php - 在php中将十进制转换为字符串
- javascript - 有没有办法注意到,什么时候改变大小?
- javascript - php 数组转换为 javascript 数组看起来不同
- dart - 如何更改材质抽屉背景颜色AngularDart?
- javascript - 无法使用 React 导入 SVG 动态