2016-09-15 4 views
0

Я использую ember 2.8.0 и ember-data 2.8.0. У меня есть следующие модели определены:данные ember не загружаются. К модели

//app/models/store.js 
import DS from 'ember-data'; 

export default DS.Model.extend({ 
    name: DS.attr('string'), 
    floor: DS.belongsTo('floor'), 
    number: DS.attr('string'), 
    phone: DS.attr('string'), 
    email: DS.attr('string'), 
    photo: DS.attr(), 
    createdAt: DS.attr('date'), 
    updatedAt: DS.attr('date') 
}); 

//app/models/floor.js 
import DS from 'ember-data'; 

export default DS.Model.extend({ 
    name: DS.attr('string'), 
    stores: DS.hasMany('store'), 
    createdAt: DS.attr('date'), 
    updatedAt: DS.attr('date') 
}); 

Мои router.js имеет следующие маршруты:

//app/router.js 
this.route('stores', function() { 
    this.route('new'); 
    this.route('edit'); 
}); 

Мои шаблоны/магазины/index.hbs имеет следующее заявление: {{#each}}

<tbody> 
     {{#each model as |store|}} 
     <tr> 
      <td>{{store.name}}</td> 
      <td>{{store.number}}</td> 
      <td>{{store.floor.name}}</td> 
      <td>{{store.phone}}</td> 
      <td>{{store.email}}</td> 
      <td>{{moment-format store.createdAt}}</td> 
      <td>{{moment-format store.updatedAt}}</td> 
     </tr> 
     {{/each}} 
</tbody> 

Я бы предположил, что линия {{store.floor.name}} будет иметь ма запрос на/floor/{id} для каждой строки в таблице.

Что мне не хватает? Каков правильный способ справиться с этим в Ember?

Должно ли мое api вернуть что-то другое, чем внизу?

[{"id":1,"floorId":1,"name":"McDonalds","number":"10-A","phone":"(11) 2020-3455","email":"[email protected]","photo":null,"createdAt":"2016-09-15T13:45:32.000Z","updatedAt":"2016-09-15T13:45:32.000Z"}] 

Следует ли использовать другие крючки модели для загрузки соответствующей модели вручную?

+1

Имена атрибутов вашей модели 'store' должны соответствовать тому, что дает вам сервер, если только вы не определили какую-либо специальную обработку для них в адаптерах/сериализаторах/где-то (я забываю, где именно это происходит сейчас), что кажется маловероятным. Итак, верните «пол» вместо «floorId», и все может начать работать. – Thernys

+0

пятно на @Thernys, спасибо! Интересно, что изменение того, что возвращает мой api, исправляет его, однако изменение имени свойства моей модели с 'floor' на' floorId' не происходит. Это будет какое-то условное соглашение? Также, чтобы ответить на вопрос? –

+0

Также вы найдете, где вы можете настроить обработку, как вы упомянули @Thernys: https://guides.emberjs.com/v2.8.0/models/customizing-serializers/#toc_relationships –

ответ

0

Как первоначально (и невнятно) ответил в комментариях, имена атрибутов вашей модели store, как ожидается, будут соответствовать тому, что дает сервер, если у вас нет defined custom processing for them in your serializer. Итак, верните floor вместо floorId, и все может начать работать.

Я не совсем уверен, почему вы не изменили имя атрибута, чтобы вместо этого использовать результаты сервера (floor: DS... => floorId: DS...). Насколько я могу судить, это должно работать так же (как, например, когда я пробовал только сейчас). Мне нравится использовать подход PEBKAC, поэтому с ограниченной доступной информацией я собираюсь предположить, что ваши тестовые условия просто могут быть испорчены. Возможно, вы уже модифицировали сервер для возврата floor, который больше не соответствовал ожиданиям модели. Возможно, вы забыли изменить {{store.floor.name}} в своем шаблоне, чтобы соответствовать новым определениям. Возможно, вы просто забыли перестроить свой проект, если используете Ember-CLI.

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

0

Способ, которым данные ember-данных ожидают, что данные из вашего бэкэнда зависят от вашего сериализатора. Вы не указали, какой сериализатор вы используете, поэтому я не могу сказать вам, что он ожидает. Но формат, ожидаемый внутренними данными ember, - jsonapi. Поэтому для вашего случая это будет правильно:

{ 
    "data": [ 
    { 
     "id": "1", 
     "type": "store", 
     "attributes": { 
     "name": "McDonalds", 
     "number": "10-A", 
     "phone": "(11) 2020-3455", 
     "email": "[email protected]", 
     "photo": null, 
     "createdAt": "2016-09-15T13:45:32.000Z", 
     "updatedAt": "2016-09-15T13:45:32.000Z" 
     }, 
     "relationships": { 
     "floor": { 
      "data": { 
      "type": "floor", 
      "id":"1" 
      } 
     } 
     } 
    } 
    ] 
} 

Убедитесь, что ваш сериализатор возвращает этот формат для вашего обратного ответа.

+1

Спасибо. Ответ уже был дан в комментариях к этому вопросу ... –

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