Javascript Ember.js-如何在更多路由之间共享路由模型数据?-为什么不在组件中加载数据?

Javascript Ember.js-如何在更多路由之间共享路由模型数据?-为什么不在组件中加载数据?,javascript,angularjs,ember.js,Javascript,Angularjs,Ember.js,TL;博士 余烬组件只是智能HTML模板。为什么他们不像以前那样为自己获取数据?以及如何在更多URL/页面上共享路由模型。似乎我必须知道哪个组件放在哪个URL上,并且我必须让它们通过路由模型获得数据。为什么该部件不在组件中 我现在学习Ember.js。我至少试过了。 目前,我很难理解为什么Ember.js会这样做。如果我在某些陈述上错了,请纠正我。我是一名Ember.js初学者。所以我在这里指出的可能是不对的 假设我们在上有一个请求,然后Ember尝试在app/routes/index.js中查

TL;博士 余烬组件只是智能HTML模板。为什么他们不像以前那样为自己获取数据?以及如何在更多URL/页面上共享路由模型。似乎我必须知道哪个组件放在哪个URL上,并且我必须让它们通过路由模型获得数据。为什么该部件不在组件中

我现在学习Ember.js。我至少试过了。 目前,我很难理解为什么Ember.js会这样做。如果我在某些陈述上错了,请纠正我。我是一名Ember.js初学者。所以我在这里指出的可能是不对的

假设我们在上有一个请求,然后Ember尝试在app/routes/index.js中查找路由模型。该文件包含我要从后端获取的数据的代码。下一个余烬将在这个文件中呈现app/templates/index.hbs,我有一个名为carlist的组件

虽然没有问题,但让我们仔细看看。对我来说,一开始我必须自己获取数据,这让我感觉很奇怪,为什么组件不自己做这件事呢?接下来的问题是如何在更多路由之间共享模型获取逻辑?也许我想把我的组件放在许多URL/页面/路由上,然后我必须复制路由模型逻辑

在我看来,组件应该自己获取数据,您可以轻松地在其他页面上插入组件,而无需复制整个路由模型获取逻辑

所以我必须知道哪个组件放在哪个URL上,并且我必须让它们通过路由模型获得数据。为什么该部件不在组件中


所以也许我对Ember不够好,我忽略了一些东西?

组件非常灵活。组件已经设计成可重用的。例如,您可以创建一个表组件并用于汽车、轮船等

所以为了可重用性,最好将提供的模型和组件分开

但是,如果您想要制作一个用于当前项目的组件,并且需要获取其自身的数据,那么您可以在该组件中获取数据

在某些情况下,您可能希望获取路由中的数据。例如,在您的页面中,您有多个组件,每个组件都需要在路由中获取的数据模型的投影


所以,这取决于您的需求,可能您需要在组件或路由中获取数据,甚至混合的组件都非常灵活。组件已经设计成可重用的。例如,您可以创建一个表组件并用于汽车、轮船等

所以为了可重用性,最好将提供的模型和组件分开

但是,如果您想要制作一个用于当前项目的组件,并且需要获取其自身的数据,那么您可以在该组件中获取数据

在某些情况下,您可能希望获取路由中的数据。例如,在您的页面中,您有多个组件,每个组件都需要在路由中获取的数据模型的投影

所以,这取决于您的需求,可能您需要在组件或路由中获取数据,甚至混合的组件都可以加载它们自己的数据,在许多情况下这是合适的。但是,如果您坚持这种模式,允许路由加载数据有几个重要的好处:

应用程序的URL将始终反映数据的状态。您不必记住在两个方向上同步它-对URL的更改应该会更改数据,而更改数据应该会更改URL。 您可以编写模板,知道它们在数据出现之前不会呈现,从而允许Ember为您处理异步。这将产生更干净、更简单的模板。 当数据加载失败时,您将获得Ember内置的错误处理。 出现在许多页面上的用户名组件通常在路由层次结构中处于相当高的位置,就像在应用程序模板中一样,在应用程序模板中,很容易从一个位置加载和呈现一次,并使其在每个子路由上保持可见

但是,如果您确实需要在许多地方使用组件,并且其数据应该是自包含的,那么可以让它自己加载。在这种情况下,您可以依靠Ember Data的存储为您提供缓存响应,以便您仅在第一次触发网络请求,也可以编写一个服务来处理组件的某些持久状态。

组件当然可以加载自己的数据,在许多情况下这是合适的。但是,如果您坚持这种模式,允许路由加载数据有几个重要的好处:

应用程序的URL将始终反映数据的状态。您不必记住在两个方向上同步它-对URL的更改应该会更改数据,而更改数据应该会更改URL。 您可以编写模板,知道它们在数据出现之前不会呈现,从而允许Ember处理 是你。这将产生更干净、更简单的模板。 当数据加载失败时,您将获得Ember内置的错误处理。 出现在许多页面上的用户名组件通常在路由层次结构中处于相当高的位置,就像在应用程序模板中一样,在应用程序模板中,很容易从一个位置加载和呈现一次,并使其在每个子路由上保持可见


但是,如果您确实需要在许多地方使用组件,并且其数据应该是自包含的,那么可以让它自己加载。在这种情况下,您可以依靠Ember Data的存储为您提供缓存响应,以便您只在第一次触发网络请求,也可以编写一个服务来处理组件的某些持久状态。

好的,很高兴知道,但您如何解决以下问题?假设我们希望在每个页面上显示用户名。我创建了一个用户组件,对我来说,组件应该在这里获取数据,因为我不想每次都将路由模型代码粘贴到一个新的路由模型文件中,该文件获取每个url上的数据。余烬结构的最佳实践是什么?@TatzyXY对于这个问题,您需要使用服务。余烬服务是单一的。您可以在登录后在用户服务中获取当前用户,并随时使用它。我完全同意您的说法,但为什么在组件加载数据时仍将其视为不好的做法。下一个问题是,为什么我们在组件中有那么多方便的方法被认为是不好的做法。组件加载数据时是不好的做法因为组件被设计为独立的和可重用的,不仅可用于一个模型,而且可用于许多不同的模型。考虑一个图形组件。如果图形在组件中获取数据,那么您必须为每个数据集使用一个新的图形组件,而不是一个可重用的组件。的确,这是一种不好的做法,但我们应该有所有这些方法来加载数据。考虑您的组件显示天气图与定制图形。这里的模型是从另一个站点google获取的天气信息。例如,组件可以获取模型本身。好的,很高兴知道,但是您如何解决以下问题?假设我们希望在每个页面上显示用户名。我创建了一个用户组件,对我来说,组件应该在这里获取数据,因为我不想每次都将路由模型代码粘贴到一个新的路由模型文件中,该文件获取每个url上的数据。余烬结构的最佳实践是什么?@TatzyXY对于这个问题,您需要使用服务。余烬服务是单一的。您可以在登录后在用户服务中获取当前用户,并随时使用它。我完全同意您的说法,但为什么在组件加载数据时仍将其视为不好的做法。下一个问题是,为什么我们在组件中有那么多方便的方法被认为是不好的做法。组件加载数据时是不好的做法因为组件被设计为独立的和可重用的,不仅可用于一个模型,而且可用于许多不同的模型。考虑一个图形组件。如果图形在组件中获取数据,那么您必须为每个数据集使用一个新的图形组件,而不是一个可重用的组件。的确,这是一种不好的做法,但我们应该有所有这些方法来加载数据。考虑您的组件显示天气图与定制图形。这里的模型是从另一个网站谷歌获取的天气信息,例如,组件可以获取模型本身。在我阅读了所有官方指南后,这个问题出现了。这个问题是结果,因为我知道约定和概念。如果我错了,请纠正我。在我阅读了Stack旁边的许多其他文章之后,我可以留下来讨论这个问题。Ember社区中的一些人认为组件不应该依赖于路线,应该独立工作。其他人说,遵循Ember惯例并将其放置在路线中。在我阅读了所有官方指南后,这个问题出现了。这个问题是结果,因为我知道约定和概念。如果我错了,请纠正我。在我阅读了Stack旁边的许多其他文章之后,我可以留下来讨论这个问题。Ember社区中的一些人认为组件不应该依赖于路径,应该独立工作。其他人说,遵循Ember约定并将其放置在路径中。