【问题标题】:Ember.js - How share route model-data between more routes? - Why not load data in component?Ember.js - 如何在更多路线之间共享路线模型数据? - 为什么不在组件中加载数据?
【发布时间】:2016-12-23 03:39:47
【问题描述】:

TL;DR Embers 组件只是智能的 HTML 模板。为什么他们不像 Angular 那样为自己获取数据?以及如何在更多 URL/页面上共享路由模型。似乎我必须知道哪些组件放置在哪个 URL 上,并且我必须使它们成为可通过路由模型使用的数据。为什么这部分不在组件中?


我现在正在学习 Ember.js。我至少试试。 目前,我很难理解 Ember.js 的行为为何如此。如果我对某些陈述有误,请纠正我。我是 Ember.js 初学者。所以也许我在这里指出的不是正确的。

假设我们在 / 上有一个请求,然后 Ember 尝试在 app/routes/index.js 中找到一个路由模型,此文件包含我想从后端获取的数据的代码。接下来 Ember 将在这个文件中渲染 app/templates/index.hbs 我有一个名为 car-list 的组件。

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

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

所以我必须知道哪些组件放置在哪个 URL 上,并且我必须使它们成为可通过路由模型使用的数据。为什么这部分不在组件中?

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

【问题讨论】:

  • 在我阅读了所有官方指南之后,这个问题出现了。这个问题是结果,因为我知道约定和概念。如果我错了,请纠正我。在我阅读了 Stack 旁边的很多其他文章之后,我可以留下这个问题是有争议的。 Ember 社区中的一些人认为组件不应该依赖于路由,应该独立工作,其他人则说遵循 Embers 约定并将其放置在路由中。

标签: javascript angularjs ember.js


【解决方案1】:

组件非常灵活。组件已实现可重用。例如,您可以创建一个表格组件并用于汽车、船舶等。

因此,为了可重用性,最好将模型提供与组件分开。

但是如果你想为当前项目制作一个组件并且需要自己获取它的数据,你可以在组件中获取数据。

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

所以这取决于您的要求,也许您需要在组件或路由甚至两者(混合)中获取数据

【讨论】:

  • 好的,很高兴知道您将如何解决以下问题?假设我们想在每个页面上显示用户名。我创建了一个用户组件,对我来说,似乎组件应该在这里获取数据,因为我不想每次都将路由模型代码粘贴到一个新的路由模型文件中,该文件获取每个 url 上的数据。 ember-structure 的最佳实践是什么?
  • @TatzyXY 对于这个问题,您需要使用服务。 Ember 服务是单例的。您可以在登录后在用户服务中获取当前用户并在任何地方使用它
  • 我完全同意你的说法,但是为什么当组件加载数据时它仍然被认为是不好的做法。下一个问题是,为什么我们在组件中有这么多方便的方法被认为是不好的做法。
  • 组件加载数据时的错误做法。 - 因为组件被设计为独立且可重用,不能仅用于一个模型,而是可用于许多不同的模型。想想一个图形组件。如果图表获取组件中的数据,那么您必须为每个数据集拥有一个新的图表组件,而不是一个可重用的组件
  • 确实这是不好的做法,但我们应该拥有所有这些方法来加载数据。考虑您的组件显示带有自定义图形的天气图。这里的模型是从另一个站点(例如谷歌)获取的天气信息。所以组件可以自己获取模型。
【解决方案2】:

组件当然可以加载它们自己的数据,而且在很多情况下这是合适的。但是,如果你坚持这种模式,允许加载数据的路由有几个重要的好处,你可以“免费”获得:

  • 您的应用程序的 URL 将始终反映数据的状态。您不必记住同步它(双向 - 更改 URL 会更改数据,更改数据会更改 URL)。
  • 您可以编写模板,知道在数据存在之前它们不会呈现,从而允许 Ember 为您处理异步。这会产生更干净、更简单的模板。
  • 当数据加载失败时,您将获得 Ember 的内置错误处理。

出现在许多页面上的用户名组件通常在路由层次结构中属于相当高的位置,就像在application 模板中一样,它很容易从一个地方加载和呈现一次,并让它在每个子节点上保持可见路线。

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

【讨论】:

    猜你喜欢
    • 2021-03-27
    • 2015-08-07
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    相关资源
    最近更新 更多