我正在尝试构建一个Ember应用程序,但我遇到了一些困难。
我有一个索引路径,我想渲染以下页面:
+--------------------------+
| Welcome, foo@bar.com |
+--------------------------+
| |
| New Posts |
| --------- |
| *foo |
| *bar |
| *baz |
| |
+--------------------------+
所以我有一个Account
模型和一个Post
模型。 (没有任何相关领域)
我在以下方面存在概念上的困难:
Ember路由具有model
方法,该方法返回路径的模型。但是,如果我想要多个模型与我的路线相关联怎么办?在这种情况下,我有Account
和Post
。如何使两个可用于我的页面?
我尝试过的一件事是使用setupController
并在控制器上手动设置account
和posts
,以便模板可以访问它们。但是,如果我能做到这一点,那么model
方法的重点/意义是什么!?
为什么Ember想要将路线与单一模型相关联?
欣赏任何建议,
谢谢, 丹尼尔
答案 0 :(得分:1)
我尝试过的一件事是使用setupController并在控制器上手动设置帐户和帖子,以便模板可以访问它们。
你正在做的是正确的,这就是setupController
钩子的用途。
但如果我能做到这一点,那么模型方法的重点是什么呢?为什么Ember想要将路线与一个模型相关联?
在 RC3 中,无法阻止默认行为。在RC4中,实现setupController
挂钩可防止发生默认行为。对于开发人员迁移到更新版本,这是一个潜在的重大变化。
另请注意,如果您的路由实现setupController
挂钩并且您希望保留默认行为(同时调用model
),请确保从this._super()
内调用setupController
{1}}钩子。您可以在宣布的博文中阅读更多here。
希望它有所帮助。
答案 1 :(得分:1)
使用model
回调有一些优势:
link-to "someRoute" model
时,当您单击该链接并转换到另一条路线时,路线将使用您为其传递的模型(不调用{{1}回调获取数据)。请参阅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
模板中呈现帐户信息。