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

Ember.js-页面上有多个组件,ember.js,Ember.js,我试图建立一个余烬应用程序,我遇到了一些困难 我有一个索引路由,我想在下面的页面中呈现它: +--------------------------+ | Welcome, foo@bar.com | +--------------------------+ | | | New Posts | | --------- | | *foo | |

我试图建立一个余烬应用程序,我遇到了一些困难

我有一个索引路由,我想在下面的页面中呈现它:

+--------------------------+
|   Welcome, foo@bar.com   |
+--------------------------+
|                          |
|        New Posts         |
|        ---------         |
|          *foo            |
|          *bar            |
|          *baz            |
|                          |
+--------------------------+
所以我有一个
账户
模型和一个
Post
模型。(没有任何相关字段)

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

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

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

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

感谢您的建议

谢谢, 丹尼尔

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

您所做的是正确的,这就是
setupController
挂钩的作用

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

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

另外请注意,如果您的路由实现了
setupController
钩子,并且您希望保留默认行为(也会调用
模型
),请确保从
setupController
钩子中调用
。\u super()
。您可以在发布的博客文章中阅读更多内容


希望有帮助。

使用
model
回调有一些优点:

  • 当您定义路由器时,它会自动生成模型回调
  • 在模板中,当您使用
    链接到“someRoute”模型时,当您单击该链接并转换到另一个路由时,该路由将使用您传入的模型作为其模型(无需调用
    模型
    回调来获取数据)
  • 但我认为最大的优势是承诺支持

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

    请注意我的意思,setupController从
    model
    callback获取数据。如果
    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);
        });
      }
    });
    
    但是,
    setupController
    不支持promise,这意味着如果您在
    setupController
    中从服务器获取数据,Ember将在准备数据之前呈现模板。在很多情况下,这不是我们想要的

    但是,
    模型
    似乎不是从服务器获取多个数据的好地方。您可以使用带有多个承诺的
    Ember.RSVP.all
    来实现这一点。但是你也需要考虑<代码>链接到。我不确定什么是最佳实践 获取路由中的多个数据并等待它们在呈现模板之前准备好。如果有人有好的解决办法,请告诉我


    对于你的情况,我认为你可以用不同的方法来做这件事。毕竟我想的是“欢迎”,foo@example.com“是所有页面的顶部栏,对吗?然后您可以将其放入
    ApplicationRoute
    ,并在
    application.hbs
    模板中呈现帐户信息。

    谢谢,这很有意义。有趣的是,
    model()
    即使在我实现
    setupController
    时也会被调用。但是我可以接受。谢谢你详细的回答!了解Ember.RSVP确实非常有用。以前,我认为在不使用setupController的情况下,每个路由只能有一个端点/模型。关于链接到
    你是对的,但我可以接受我的用例。