Ember.js: отображать элементы внутри отношения hasMany

Учитывая эти модели:

App.TransportDocument = DS.Model.extend
  number: DS.attr 'string'
  date: DS.attr 'string'
  printable_url: DS.attr 'string'
  transport_document_rows: DS.hasMany('App.TransportDocumentRow')

App.TransportDocumentRow = DS.Model.extend
  product_name: DS.attr 'string'
  quantity: DS.attr 'number'
  measure: DS.attr 'string'
  transport_document: DS.belongsTo('App.TransportDocument')

вот мои маршруты:

App.TransportDocumentsRoute = Ember.Route.extend
  model: -> App.TransportDocument.find()

App.TransportDocumentRoute = Ember.Route.extend
  model: (params)-> App.TransportDocument.find(params.transport_document_id)

App.TransportDocumentRowRoute = Ember.Route.extend
  model: -> App.TransportDocumentRow.find()

У меня есть шаблон руля:

{{#each transport_document in controller}}
  td_id: {{transport_document.id}}
  {{#each transport_document_row in transport_document.transport_document_rows}}
    row_id: {{id}}
  {{/each}}
{{/each}}

я ожидал, что мой результат будет:

td_id: 1 row_id: 1 row_id: 2 row_id: 3
td_id: 2 row_id: 3 row_id: 4 row_id: 5
td_id: 3 row_id: 8 row_id: 7 row_id: 6

но это:

td_id: 1 row_id: row_id: row_id:
td_id: 2 row_id: row_id: row_id:
td_id: 3 row_id: row_id: row_id:

вот ответ моего сервера на /transport_documents

{"transport_documents":
  [
    {"id":1,"number":"11","date":"17/04/2013","cause":"Conto lavorazione","transport_document_row_ids":[3,2,1],"transport_document_rows":    
      [
        {"transport_document_row":{"id":3,"transport_document_id":1,"product_name":"suola puzzle verde","quantity":"1","measure":"pz","}},
        {"transport_document_row":{"id":2,"transport_document_id":1,"product_name":"lacci rossi","quantity":"2","measure":"pz"}},
        {"transport_document_row":{"id":1,"transport_document_id":1,"product_name":"Rotolo di tela","quantity":"50","measure":"m"}}
      ]},
    {"id":2,"number":"2","date":"18/04/2013","cause":"Conto lavorazione","transport_document_row_ids":[6,5,4],"transport_document_rows":
      [
        {"transport_document_row":{"id":6,"transport_document_id":2,"product_name":"suola puzzle verde","quantity":"1","measure":"pz"}},
        {"transport_document_row":{"id":5,"transport_document_id":2,"product_name":"lacci rossi","quantity":"2","measure":"pz"}},
        {"transport_document_row":{"id":4,"transport_document_id":2,"product_name":"Rotolo di tela","quantity":"50","measure":"m",}}
      ]},
    {"id":3,"number":"3","date":"19/04/2013","cause":"Conto lavorazione","transport_document_row_ids":[9,8,7],"transport_document_rows":
      [
        {"transport_document_row":{"id":9,"transport_document_id":3,"product_name":"suola puzzle verde","quantity":"1","measure":"pz"}},
        {"transport_document_row":{"id":8,"transport_document_id":3,"product_name":"lacci rossi","quantity":"2","measure":"pz"}},
        {"transport_document_row":{"id":7,"transport_document_id":3,"product_name":"Rotolo di tela","quantity":"50","measure":"m"}}]}

я думаю, что я делаю что-то неправильно в маршрутах (где я могу определить запрос, чтобы найти все строки ЭТОГО документа?), но я не уверен. в гайдах ничего подобного не нашел

Спасибо


person Alive Developer    schedule 17.04.2013    source источник


Ответы (1)


Согласно соглашению, код по умолчанию в Route#serialize возвращает объект, содержащий идентификатор модели, однако имя свойства не id, а комбинация имени модели и идентификатора, который в вашем случае должен быть transport_document_id.

Объект, возвращаемый методом serialize, будет передан в качестве аргумента в Route#model. . Это также объясняется в руководстве по маршрутизации.

Ваш маршрут должен быть примерно таким:

App.TransportDocumentRoute = Ember.Route.extend
  model: (params)-> 
    App.TransportDocument.find(params.transport_document_id)

или вы можете переопределить serialize вашего маршрута, чтобы указать другое имя параметра. Вы можете найти пример другой реализации сериализации здесь .


Что касается запроса, вы можете фильтровать аналогично следующему:

App.TransportDocumentRowRoute = Ember.Route.extend
  model: (params) -> App.store.filter App.TransportDocumentRow, (row) ->
    # might have to implement Route#serialize to also provide the 
    # transport_document_id property in this route
    row.get 'transport_document_id' == params.transport_document_id

Однако это отфильтрует только те записи, которые у вас есть в магазине. Если записи строк еще не получены, вам также придется запустить GET для их извлечения.

Кстати, извините, если синтаксис не на 100%. Я не говорю о кофе :)

person MilkyWayJoe    schedule 17.04.2013
comment
- первая часть ответа: у меня есть маршрут, определенный таким образом. У меня есть сведения о моем объекте (но запросы не запускаются. Ожидается ли это? Когда я получаю /index json, у него уже есть все атрибуты) - вторая часть ответа: как мне запустить GET? - person Alive Developer; 18.04.2013
comment
я объясню лучше: когда я перехожу к transport_documents, есть вызов ajax, который правильно возвращает все мои повторы. Оттуда, когда я перехожу к transport_documents/1, запросы не выполняются. Может проблема здесь? - person Alive Developer; 18.04.2013
comment
я задам для него вопрос, это атомарный вопрос и может быть полезен другим людям, потому что я нигде не могу найти похожие вопросы - person Alive Developer; 18.04.2013
comment
DS.Model#find запускает GET. Что касается этих вопросов, мне нужно увидеть больше кода, чтобы прокомментировать. - person MilkyWayJoe; 18.04.2013
comment
Я исправил первую часть, как вы сказали: вы были правы, и теперь все в порядке. для второй части: я думаю, что у меня есть свои записи в магазине (как вы можете видеть из ответа). Может я не так делаю? - person Alive Developer; 18.04.2013