我只是围绕角2来看我的头,并正在设计一个向导类型的应用程序。第1页上的组件需要将数据传送到其他页面上的组件。考虑使用服务来保存在向导的下一个视图/组件中注入的状态/数据。整个事情应该松散耦合。我不认为设计一个可观察的模式是有用的,因为在下一个页面/视图之一上的组件是不可见的。角2中有哪些新功能可以用来解决这个问题?如何保持角2的状态?
回答
RxJS供电状态管理应用在
我建议保持你的状态集中使用例如Redux。然后,您将使用角的@Input()和@Output()将状态传播到组件,并从组件中分派状态更改。
您将拥有一个订阅状态更改的顶级组件,并使用子组件@Inputs传播这些组件。您的子组件会使用@Outputs()向顶层组件发出状态更改请求,然后更新中央状态。
通过这种方式,您的单个组件不必知道有关状态如何存储和更新的任何信息,它们仅提供功能并接受对其功能具有预期效果的输入参数。
如果您有许多深度嵌套的组件,它们本身也使用@Input()和@Output()来提供功能,并且不直接与任何状态存储进行通信。
我自己使用这种方法,它使每个组件都非常精简并且可重用,同时使它非常容易跟踪您的状态,并降低了跨组件同步状态的复杂性。
您还应该看看ChangeDetectionStrategy和ChangeDetectorRef,因为您可以使用此方法简化组件更改检测。您的所有子组件通常都可以使用所谓的OnPush检查策略,这意味着它们的更改检测将仅在其@Input()属性发生更改时才运行。由于这是在这种情况下状态将会改变的唯一方式,所以您可以通过角度来说明,否则就不会检查更改。这也将有助于提高性能。
请注意,您可以只使用常规的angular2服务来保持状态,但像Redux这样的东西可以免费提供一些东西,例如提供的开发工具。如果你使用Redux,也可以看看Immutable.js,因为重要的是不要直接使用Redux来改变状态。通过终极版的Angular2启发
谢谢,这是一个不错的方法!如果是深度嵌套的子组件,那么如何将状态更改一直返回到保存视图/应用程序的“主”状态的顶级组件?你有一连串的输出到顶端,还是有一个可以绕过这些链条的捷径? – Janne
通常你会有一连串的输出到最上面。如果它的嵌套方式过于舒适,可能需要将顶层组件的责任分解为多个组件,这些组件正在操纵和订阅中央集权状态的不同区域。 – jgranstrom
我还没有完全掌握最佳做法和/或角度“希望”我这样做的方式。在大多数情况下,我一直依赖大量的输入输出,但最近我意识到我可以将一些属性添加到服务中,并将其注入到我需要保存状态的组件中。服务本质上是更“集中的存储” - 也许这就是Redux的做法,只是方法更复杂?或没有?我的方法使用服务并依赖DI而不是大量的In/Out有任何问题。我发现注入服务更容易。 – JzInqXc9Dg
- 1. 如何在角度2中保存组件的状态?
- 2. 如何保持Android活动的状态
- 3. 如何保持CheckBoxList的更改状态?
- 4. 如何在Android中保持我之前状态的UI状态?
- 5. OneLogin session_via_api_token如何“保持登录状态”
- 6. 如何使JOptionPane保持打开状态
- 7. NSTimer:applicationDidEnterBackground:倒计时(如何保持状态)
- 8. QWidget如何保持最佳状态?
- 9. 配置保持活动状态始终保持连接状态
- 10. 保持以前的状态
- 11. FTP传送器保持保持状态
- 12. 保存组件状态[角]
- 13. JQuery Ajax Tabs +保持状态
- 14. 装饰:保持状态
- 15. SimpleSAMLphp保持登录状态
- 16. 在Yesod中保持状态
- 17. JQuery保持多个拖放状态以保持项目的颜色与状态
- 18. 角2应用的状态管理
- 19. 如何使用Angular工厂在角度控制器之间保持状态
- 20. Azure'网络角色可以保持活动状态多久?
- 21. 角度自定义异步验证器保持待定状态
- 22. 如何保持锚在相同的状态为:点击后悬停状态?
- 23. 如何保持的ImageButton在按下状态并显示按下状态
- 24. 如何确保JDialog始终保持最佳状态
- 25. 电报API:如何保持ApiState保存签到状态
- 26. 角2从URL保留状态重定向后
- 27. 更改Form2上的复选框的状态并保持状态
- 28. 角2 - 如何保持与输入的值
- 29. 如何在角度2中创建可选的根状态?
- 30. 如何激活保持活动状态,http://www.webpagetest.org表示保持活动状态未激活
请添加一些代码演示您尝试完成的任务。 Angular提供'@Input()','@Output()'用于父子关系(某种程度上用于兄弟),以及用于所有其他服务。 –
旧的好的路由参数是从一条路径传递到另一条路由的吗? – smnbbrv
您可以使用带有RxJS行为副本的服务来确保尚未显示的组件在初始化时获取最新数据。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/behaviorsubject.md – Harry