我无法弄清楚为什么需要一个事件从子级到父级(@Output
)共享,而@Input()
对于父级到子级也很好。
如果我们想与父组件共享数据而不用像@Input
那样单击任何按钮怎么办?如果组件之间没有任何关联怎么办?
答案 0 :(得分:1)
我们为什么需要一个活动?
因为这样可以防止循环引用。如果父母提到孩子,而孩子提到父母,那将是循环参考。这也增加了代码的复杂性。如果我正在编写“按钮”组件,则不必担心哪种组件在握住我的按钮组件。
如果我们想与父组件共享数据而无需单击该怎么办 任何类似@Input的按钮?
您可以通过编程触发事件。例如,您可能有一个计时器组件,该组件使用可观察到的RxJS interval
每5秒触发一次事件。
interval(5000).subscribe(() => myOutput.next());
如果组件之间没有任何关联怎么办?
然后,他们应该通过共享服务而不是使用Input
和Output
进行通信。
答案 1 :(得分:0)
对于您的问题的第一部分,我想详细说明:
我无法弄清楚为什么需要发生一个事件以将数据从子级共享到父级(@Output),而@Input()对于父级到子级来说却很好。
因为Angular具有从上到下的单向变化检测系统。
这意味着父级中的更改会传播给子级,而不会通过设计将其传播到子级,从而使应用程序状态流更易于理解。 >
对于绑定属性(例如用@input
装饰的属性),父级中的值(对于基元)或引用(对于对象)的更改将触发更改检测,并且子级将使用新值或参考。
例如,在子级中重新分配@input
属性不会更新父级中的引用,因为这会违反上述自上而下的设计。
虽然有一个 decorator 用于输出,但是没有从下到上的变化检测,因此必须将这个方向的变化明确告知父对象,例如带有事件,确切地说是会发生什么。
更多笔记
尽管所有这些,更改子级中的绑定属性仍然有可能导致更改在父级中可见。当将对象引用传递给子对象并且子对象使用该引用对对象进行突变时,会发生这种情况,因为最终,它仍然是Javascript,并且父子对象都引用了同一对象。 AND ,如果 else 导致更改检测在父级中触发,从而更新DOM,并且在屏幕上观察到此突变的影响。
但是,这段代码很难理解和调试,而@output
是声明性的和清晰的。