2015-01-31 3 views
1

Я делаю простой веб-чат с 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 последних сообщений = 1000 элементов в моем JSON для каждого запроса). Поэтому я хочу называть сервер для сообщений только при выборе чата.

Вы знаете, как это сделать, или, может быть, что-то не так, что я делаю в первую очередь?

Обновления

код шаблона из 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

Можете ли вы поделиться кодом шаблона, в котором вы ссылаетесь на комнату? –

+0

@BuckDoyle Я обновил свой вопрос. –

ответ

0

В итоге я добавил свойство ссылок в ответ JSON для чатов. Когда содержимое чата должно отображаться, используется ссылка и полученные сообщения. Для этого требуется только два запроса, и нет необходимости предварительно загружать все сообщения из всех чатов и не нужно делать запрос для каждого сообщения.

1

Как обсуждалось в this thread, когда вы link-to а маршрут и модель уже загружены, крючок model не запускается, потому что нет необходимости перезагружать данные.

Если переход к маршруту и ​​все контекст объекты -The объекты, которые будут служить в качестве моделей для Templates- передаются в, то beforeModel и model крючки не будет называться.

Позже в резьбе Балинт corrects:

В самом деле, beforeModel крючок еще не вызывается в этом случае, это только модель крюк, который не делает.

Если вы хотите, чтобы модель будет перезагружен, вы можете изменить ссылку, чтобы использовать ID вместо модели:

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

Вы также можете загрузить данные в beforeModel или afterModel крючках , или setupController.


Кроме того, в chatrooms/show маршруте, вы получаете уже загруженную модель из хранилища Ember данных вместо загрузки с сервера. Попробуйте следующее:

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

Я изменил 'chatroom' для' chatroom.id', но у меня все еще такая же проблема. Даже когда я перезагружаю приложение и получаю доступ к '/ chatrooms/1', сообщениям или не вызываются. Когда я удаляю крюк 'model' в верхнем маршруте, я просто больше не получаю список комнат, и по-прежнему нет вызова для сообщений. –

+0

Хмм, вы можете поделиться своим кодом маршрута? –

+0

Вопрос обновлен. –

Смежные вопросы