我最近开始对新项目使用角度2,并且对于接下来的最佳方法避免了一些混淆。我有一个父组件(ROOT),它有3个子组件,A(表格格式的搜索结果项目列表),B(谷歌地图)和C(具有多个输入/选择下拉列表的表单),父组件。角度2组件通信混淆
组件C(精简形式)应该是位于我已注入到ROOT父组件中的服务中的API端点所使用的搜索标准参数的主要驱动程序。返回的对象(目前从HTTP调用可观察到的)将被用于养活所有3个组件,渲染列表,地图等
现在,我真的不能让我的头周围就是:
1 )我应该如何从精简搜索组件中的输入/选择中获取数据?我是否应该为每个领域实施输出?或者根父母是否应该使用viewChild以某种方式听取对它们的更改?
2)我是否应该订阅父级中的服务可观察项,然后将它传递给列表和映射组件?
任何帮助或建议将不胜感激,那里有很多的地狱来学习我还在试图让我的头周围一切,不知道如果IM甚至在以正确的方式接近它:/
非常感谢花时间来解释,这很有道理!在从表单获取数据方面,我们希望只要表单字段发生更改(即不提交点击),就会刷新api数据。是否将传递一个新的可观察对象(将输入绑定到的属性)传递给表单组件并订阅对它的更改?或者我有完全错误的? – Steve
不要在表单中使用异步,它只会导致痛苦和困惑 在形式'valuesChange'和'commit'上有一个输入,'values'和两个输出 - 根组件将在订阅'valuesChanges'时表单字段已更改(可能有无效数据),并在保存表单时提交。 在根组件中,通过api服务处理数据,然后将结果传递回'values'来重绘表单。您也可以在'changed'事件发射器上使用'Observable.debounce'来避免请求发送垃圾邮件。 – ovangle
ps。另一种方法是通过'@ Input'从根组件传入一个异步验证函数,并在表单中构建'control'时使用它(如果您使用的是反应形式,您应该这么做))。 – ovangle