如何在一个路线及其子路线中拥有两个不同的模型?

时间:2015-01-31 16:07:09

标签: ember.js ember-data

我正在与Ember建立一个简单的网络聊天系统。

我有一个路由/chatrooms列出了几个聊天室,然后我还有/chatrooms/:chatroom_id,它应该显示带有消息的实际聊天室。

第二条路线位于第一条路线内,如下所示:

this.resource('chatrooms', function() {
  this.route('show', {
    path: ':chatroom_id'
  });
});

当我访问/chatrooms时,调用服务器(/api/chatrooms)会返回并显示房间列表,如预期的那样。

当我点击一个房间时,应用程序转换为/chatrooms/id,但是即使我尝试定义模型,也没有调用来检索消息(/api/chatrooms/id处可用)。

我和用户有类似的情况。检索用户列表,然后显示。单击名称时,将显示配置文件。没有第二次通话,但是没关系,因为Ember已经了解了用户的所有信息。

在我目前的情况下,当首次返回列表时,它包含除消息之外的所有信息。我相信这将是太多了(10个聊天室* 100个最后消息=我的JSON中的1000个元素用于每个请求)。所以我只想在选择聊天室的时候给服务器打电话。

你知道怎么做,或者说我先做错了吗?

更新

来自app/templates/chatrooms.hbs

的模板代码
<h1>Chatrooms</h1>
<ul class="sub-menu nobullet flex mas">
    {{#each chatroom in model}}
        <li class="mrs">{{link-to chatroom.name "chatrooms.show" chatroom class="pat"}}</li>
    {{/each}}
</ul>
{{outlet}}

在这种情况下,模型是一组聊天室。

我的路线:

应用程序/路由/ chatrooms.js

export default Ember.Route.extend({
  model: function() {
    return this.store.find('chatroom');
  }
});

应用程序/路由/聊天室/ show.js

export default Ember.Route.extend({
  model: function(params) {
    return this.store.get('chatroom', params.chatroom_id);
  },
  actions: {
    send: function() {
      ...
    }
  }
});

2 个答案:

答案 0 :(得分:1)

正如this thread中所讨论的,当您link-to路由并且模型已经加载时,路由的model挂钩不会被触发,因为不需要重新加载数据。

  

如果您转换到路线并且所有上下文对象(将作为模板模型的对象)传入,beforeModelmodel挂钩将会不被称为。

后来在线程balint corrects

  

事实上,在这种情况下仍会调用beforeModel钩子,它只是模型钩子没有。

如果要强制重新加载模型,可以更改链接以使用ID而不是模型:

{{link-to chatroom.name "chatrooms.show" chatroom.id class="pat"}}

您还可以在beforeModelafterModel挂钩或setupController中加载数据。


此外,在chatrooms/show路由中,您将从Ember Data存储中获取已加载的模型,而不是从服务器加载它。试试这个:

return this.store.find('chatroom', params.chatroom_id);

答案 1 :(得分:0)

我最终为chatrooms的JSON响应添加了一个links属性。当必须显示聊天室的内容时,使用链接并检索消息。它只需要两个请求,并且不需要预先加载来自所有聊天室的所有消息,也不需要为每条消息发出请求。