2013-12-06 4 views
0

я работаю с простым меню ресторана на данный момент, и я получаю следующее JSON от сервера:Встроенные модели в Ember данных 1.0.0-beta.2

[ 
    { 
    "id": 251, 
    "name": "Borsch", 
    "category_id": 47, 
    "price": "135.0", 
    "photo": { 
     "origin": "/path/to/origin.png", 
     "resize": "/path/to/resize.png" 
    } 
    }, 
    // A lot of other dishes 
] 

Как вы можете видеть, у меня есть photo, который является сложным объектом. На emberjs.com они предлагают использовать встроенные модели для этого. Хорошо, до сих пор так хорошо, и я решил создать следующие модели:

App.Dish = DS.Model.extend({ 
    name: DS.attr('string'), 
    price: DS.attr('number'), 
    category_id: DS.attr('number'), 
    photo: DS.belongsTo('photo') 
}); 

App.Photo = DS.Model.extend({ 
    origin: DS.attr('string'), 
    resize: DS.attr('string') 
}); 

, но он не работает, даже когда я добавил этот код

DS.RESTAdapter.map('App.Dish',{ 
    photo: { 
     embedded:'always' 
    } 
}); 

Так после этого я гугле немного и пришел с this link, где объясняется, что они больше не поддерживают встроенные записи.

После некоторого мышления я решил принести photo.origin и photo.resize на верхний уровень JSON внутри RESTSerializer и теперь у меня есть это полностью рабочая модель:

App.Dish = DS.Model.extend({ 
    name: DS.attr('string'), 
    price: DS.attr('number'), 
    category_id: DS.attr('number'), 
    photo_origin: DS.attr('string'), 
    photo_resize: DS.attr('string') 
}); 

и это немного трансформированный RESTSerializer JSON:

{ 
    "dishes": 
    [ 
    { 
     "id": 251, 
     "name": "Borsch", 
     "category_id": 47, 
     "price": "135.0", 
     "photo_origin": "/path/to/origin.png", 
     "photo_resize": "/path/to/resize.png" 
     } 
    }, 
    // A lot of other dishes 
    ] 
} 

Теперь у меня есть несколько вопросов. Является ли мой подход приемлемым? Если нет, как мне нужно обрабатывать сложные JSON с вложенными объектами? Если да, то как мне нужно обрабатывать еще более сложные JSON с глубоко вложенными (например, пятью уровнями) объектами? Почему ember перестала поддерживать встроенные модели?

ответ

1

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

Теперь я не знаю, есть ли у вас контроль над выходом JSON сервера, но, используя отношения, EmberJS ожидает, что ваш JSON будет структурирован таким образом (в зависимости от вашего адаптера EmberData).

{ 
    dish: [{ 
    "id": 251, 
    "name": "Borsch", 
    "category_id": 47, 
    "price": "135.0", 
    "photos": [1] 
    }], 
    photo: [{ 
    "id": 1 
    "origin": "/path/to/origin.png", 
    "resize": "/path/to/resize.png" 
    }] 
} 

Теперь Ember создаст Блюдо и Фото и свяжет их вместе.

Я думаю, что это был бы правильный способ справиться с этим.

+0

Ничего себе, это действительно работает! И выглядит немного лучше, хотя требует немного больше обработки JSON. – DaZzz

+0

@DaZzz Отлично! Не забудьте принять ответ, если он ответил на ваш вопрос. – MartinElvar

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