2016-04-29 76 views
9

我只是围绕角2来看我的头,并正在设计一个向导类型的应用程序。第1页上的组件需要将数据传送到其他页面上的组件。考虑使用服务来保存在向导的下一个视图/组件中注入的状态/数据。整个事情应该松散耦合。我不认为设计一个可观察的模式是有用的,因为在下一个页面/视图之一上的组件是不可见的。角2中有哪些新功能可以用来解决这个问题?如何保持角2的状态?

+0

请添加一些代码演示您尝试完成的任务。 Angular提供'@Input()','@Output()'用于父子关系(某种程度上用于兄弟),以及用于所有其他服务。 –

+0

旧的好的路由参数是从一条路径传递到另一条路由的吗? – smnbbrv

+0

您可以使用带有RxJS行为副本的服务来确保尚未显示的组件在初始化时获取最新数据。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/behaviorsubject.md – Harry

回答

7

我建议保持你的状态集中使用例如Redux。然后,您将使用角的@Input()和@Output()将状态传播到组件,并从组件中分派状态更改。

您将拥有一个订阅状态更改的顶级组件,并使用子组件@Inputs传播这些组件。您的子组件会使用@Outputs()向顶层组件发出状态更改请求,然后更新中央状态。

通过这种方式,您的单个组件不必知道有关状态如何存储和更新的任何信息,它们仅提供功能并接受对其功能具有预期效果的输入参数。

如果您有许多深度嵌套的组件,它们本身也使用@Input()和@Output()来提供功能,并且不直接与任何状态存储进行通信。

我自己使用这种方法,它使每个组件都非常精简并且可重用,同时使它非常容易跟踪您的状态,并降低了跨组件同步状态的复杂性。

您还应该看看ChangeDetectionStrategy和ChangeDetectorRef,因为您可以使用此方法简化组件更改检测。您的所有子组件通常都可以使用所谓的OnPush检查策略,这意味着它们的更改检测将仅在其@Input()属性发生更改时才运行。由于这是在这种情况下状态将会改变的唯一方式,所以您可以通过角度来说明,否则就不会检查更改。这也将有助于提高性能。

请注意,您可以只使用常规的angular2服务来保持状态,但像Redux这样的东西可以免费提供一些东西,例如提供的开发工具。如果你使用Redux,也可以看看Immutable.js,因为重要的是不要直接使用Redux来改变状态。通过终极版的Angular2启发

+0

谢谢,这是一个不错的方法!如果是深度嵌套的子组件,那么如何将状态更改一直返回到保存视图/应用程序的“主”状态的顶级组件?你有一连串的输出到顶端,还是有一个可以绕过这些链条的捷径? – Janne

+1

通常你会有一连串的输出到最上面。如果它的嵌套方式过于舒适,可能需要将顶层组件的责任分解为多个组件,这些组件正在操纵和订阅中央集权状态的不同区域。 – jgranstrom

+1

我还没有完全掌握最佳做法和/或角度“希望”我这样做的方式。在大多数情况下,我一直依赖大量的输入输出,但最近我意识到我可以将一些属性添加到服务中,并将其注入到我需要保存状态的组件中。服务本质上是更“集中的存储” - 也许这就是Redux的做法,只是方法更复杂?或没有?我的方法使用服务并依赖DI而不是大量的In/Out有任何问题。我发现注入服务更容易。 – JzInqXc9Dg