我正在与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() {
...
}
}
});
答案 0 :(得分:1)
正如this thread中所讨论的,当您link-to
路由并且模型已经加载时,路由的model
挂钩不会被触发,因为不需要重新加载数据。
如果您转换到路线并且所有上下文对象(将作为模板模型的对象)传入,
beforeModel
和model
挂钩将会不被称为。
后来在线程balint corrects:
事实上,在这种情况下仍会调用
beforeModel
钩子,它只是模型钩子没有。
如果要强制重新加载模型,可以更改链接以使用ID而不是模型:
{{link-to chatroom.name "chatrooms.show" chatroom.id class="pat"}}
您还可以在beforeModel
或afterModel
挂钩或setupController
中加载数据。
此外,在chatrooms/show
路由中,您将从Ember Data存储中获取已加载的模型,而不是从服务器加载它。试试这个:
return this.store.find('chatroom', params.chatroom_id);
答案 1 :(得分:0)
我最终为chatrooms的JSON响应添加了一个links属性。当必须显示聊天室的内容时,使用链接并检索消息。它只需要两个请求,并且不需要预先加载来自所有聊天室的所有消息,也不需要为每条消息发出请求。