3

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

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

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

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

我对以下内容有概念上的困难:

Ember 路由有一个model返回路由模型的方法。但是,如果我希望多个模型与我的路线相关联怎么办?在这种情况下,我有AccountPost。我如何使它们用于我的页面?

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

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

感谢任何建议,

谢谢,丹尼尔

4

2 回答 2

1

使用model回调有一些优点:

  1. 当您定义路由器时,它会自动生成模型回调。
  2. 在模板中,当您使用link-to "someRoute" model,然后当您单击该链接并转换到另一条路线时,该路线将使用您传入的模型作为其模型(无需调用model回调来获取数据)。

请参阅http://emberjs.com/api/classes/Ember.Route.html#method_model

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

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

注意我的意思是 setupController 从model回调中获取数据。如果model回调返回一个promise,路由会等到这个promise被解决,然后从promise中获取数据。如果 promise 正在处理,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);
    });
  }
});

但是,setupController不支持promise,这意味着如果你从服务器中获取数据setupController,Ember 会在数据准备好之前渲染模板。在许多情况下,这不是我们想要的。

但是,这model似乎不是从服务器获取多个数据的好地方。您可以使用Ember.RSVP.all多个 Promise 来做到这一点。但你也需要考虑link-to。我不确定在一条路线中获取多个数据并在渲染模板之前等待它们全部准备好的最佳做法是什么。如果有人有好的解决方案,请告诉我!

对于您的情况,我认为您可以使用不同的路线来执行此操作。毕竟我认为像“Welcome, foo@example.com”这样的东西是所有页面的顶部栏,对吧?然后你可以把它放进去,然后在模板ApplicationRoute中渲染账户信息。application.hbs

于 2013-10-19T01:34:31.647 回答
1

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

您所做的是正确的,这就是setupController钩子的用途。

但是,如果我能做到这一点,那么模型方法的意义/意义是什么!?为什么 Ember 只想将路线与单个模型相关联?

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

另请注意,如果您的路由实现了setupController钩子并且您想保留默认行为(model也被调用),请确保您this._super()setupController钩子中调用。您可以在宣布的博客文章中阅读更多信息。

希望能帮助到你。

于 2013-08-04T19:29:21.393 回答