首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在一条路线和它的子路线内有两种不同的模型?

如何在一条路线和它的子路线内有两种不同的模型?
EN

Stack Overflow用户
提问于 2015-01-31 16:07:08
回答 2查看 56关注 0票数 1

我正在用Ember制作一个简单的网络聊天系统。

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

第二条路线在第一条之内,如下所示:

代码语言:javascript
复制
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的模板代码

代码语言:javascript
复制
<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}}

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

我的路线:

app/路由/空降兵app

代码语言:javascript
复制
export default Ember.Route.extend({
  model: function() {
    return this.store.find('chatroom');
  }
});

app/routes/聊天室/show.js

代码语言:javascript
复制
export default Ember.Route.extend({
  model: function(params) {
    return this.store.get('chatroom', params.chatroom_id);
  },
  actions: {
    send: function() {
      ...
    }
  }
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-05 21:14:10

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

票数 0
EN

Stack Overflow用户

发布于 2015-01-31 16:57:02

正如在这条线中所讨论的,当您已经加载了一个路由并且已经加载了模型时,不会触发路由的model钩子,因为不需要重新加载数据。

如果您转换到一个路由,并且all --作为模板模型的上下文对象-the对象将被传入,则不会调用beforeModelmodel钩子。

稍后在线程balint 改正

实际上,在这种情况下,beforeModel钩子仍然会被调用,只有模型钩子没有调用。

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

代码语言:javascript
复制
{{link-to chatroom.name "chatrooms.show" chatroom.id class="pat"}}

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

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

代码语言:javascript
复制
return this.store.find('chatroom', params.chatroom_id);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28253648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档