Ember.js - 页面上的多个组件

时间:2013-08-04 18:24:48

标签: ember.js

我正在尝试构建一个Ember应用程序,但我遇到了一些困难。

我有一个索引路径,我想渲染以下页面:

+--------------------------+
|   Welcome, foo@bar.com   |
+--------------------------+
|                          |
|        New Posts         |
|        ---------         |
|          *foo            |
|          *bar            |
|          *baz            |
|                          |
+--------------------------+

所以我有一个Account模型和一个Post模型。 (没有任何相关领域)

我在以下方面存在概念上的困难:

Ember路由具有model方法,该方法返回路径的模型。但是,如果我想要多个模型与我的路线相关联怎么办?在这种情况下,我有AccountPost。如何使两个可用于我的页面?

我尝试过的一件事是使用setupController并在控制器上手动设置accountposts,以便模板可以访问它们。但是,如果我能做到这一点,那么model方法的重点/意义是什么!?

为什么Ember想要将路线与单一模型相关联?

欣赏任何建议,

谢谢, 丹尼尔

2 个答案:

答案 0 :(得分:1)

  

我尝试过的一件事是使用setupController并在控制器上手动设置帐户和帖子,以便模板可以访问它们。

你正在做的是正确的,这就是setupController钩子的用途。

  

但如果我能做到这一点,那么模型方法的重点是什么呢?为什么Ember想要将路线与一个模型相关联?

RC3 中,无法阻止默认行为。在RC4中,实现setupController挂钩可防止发生默认行为。对于开发人员迁移到更新版本,这是一个潜在的重大变化。

另请注意,如果您的路由实现setupController挂钩并且您希望保留默认行为(同时调用model),请确保从this._super()内调用setupController {1}}钩子。您可以在宣布的博文中阅读更多here

希望它有所帮助。

答案 1 :(得分:1)

使用model回调有一些优势:

  1. 定义路由器时会自动生成模型回调。
  2. 在模板中,当您使用link-to "someRoute" model时,当您单击该链接并转换到另一条路线时,路线将使用您为其传递的模型(不调用{{1}回调获取数据)。
  3. 请参阅http://emberjs.com/api/classes/Ember.Route.html#method_model

    但我认为最大的优势是承诺支持。

    路由使用model回调来获取所需的数据,然后在model中,它将数据传递给第二个参数。

    注意我的意思是setupController从setupController回调中获取数据。如果model回调返回一个promise,路由将等待,直到解除此promise,然后从promise获取数据。如果承诺正在处理,则不会调用model,并且不会呈现模板。

    setupController

    当您可以使用App.PostsRoute = Em.Route.extend({ model: function() { // The server response an array of posts like [{name: 'foo'}, {name: 'bar'}, {name: 'baz'}] return $.get('/api/posts.json'); }, setupController: function(controller, model) { console.log(model); // it's array, not promise object controller.set('model', model); } }); 执行相同的操作时,它是这样的:

    setupController

    但是,App.PostsRoute = Em.Route.extend({ setupController: function(controller, model) { $.get('/api/posts.json').then(function(data) { controller.set('model', data); }); } }); 不支持promise,这意味着如果从setupController中的服务器获取数据,Ember将在准备数据之前呈现模板。在许多情况下,它不是我们想要的。

    但是,setupController似乎不是从服务器获取多个数据的好地方。您可以使用具有多个承诺的model来执行此操作。但你还需要考虑Ember.RSVP.all。我不确定什么是最佳做法 获取路径中的多个数据并在渲染模板之前等待它们全部准备好。如果有人有一个好的解决方案,请告诉我!

    根据您的情况,我认为您可以使用不同的路线来执行此操作。毕竟我想像"欢迎,foo @ example.com"是所有页面的顶栏,对吧?然后,您可以将其放入link-to,并在ApplicationRoute模板中呈现帐户信息。