2015-07-30 3 views
4

Я использую последнюю версию EmberJS и Ember Data. У меня есть следующие данные в формате JSON:Неверный формат JSON для данных Ember

[{ 
    "id": 6, 
    "name": "First object", 
    "vol": 40, 
    "description": "bla bla bla", 
    "category": "first" 
}, { 
    "id": 7, 
    "name": "Second object", 
    "vol": 17, 
    "description": "Some description", 
    "category": "second" 
}] 

И следующую модель:

import DS from 'ember-data'; 

export default DS.Model.extend({ 
    name: DS.attr('string'), 
    vol: DS.attr('number'), 
    description: DS.attr('string'), 
    category: DS.attr('string') 
}); 

И я не понимаю, как сделать работы данных Ember. У меня есть подозрения, что уголек данные ожидает что-то вроде следующего:

[{ 
    model-name { 
     "id": 6, 
     "name": "First object", 
     "vol": 40, 
     "description": "bla bla bla", 
     "category": "first" 
    } 
}, { 
    model-name { 
     "id": 7, 
     "name": "Second object", 
     "vol": 17, 
     "description": "Some description", 
     "category": "second" 
    } 
}] 

В консоли У меня есть куча предупреждений:

WARNING: Encountered "0" in payload, but no model was found for model 
name "0" (resolved model name using emdber-drink- 
[email protected]:application:.modelNameFromPayloadKey("0")) 
WARNING: Encountered "1" in payload, but no model was found for model 
name "1" (resolved model name using emdber-drink- 
[email protected]:application:.modelNameFromPayloadKey("1")) 

И более сотни подобных записей (то есть, сколько записей сервер возвращает по запросу). И никаких данных в магазине.

Как исправить эту проблему, не меняя JSON, который я получаю с сервера?

+0

Какая у вас проблема? Ошибки в консоли? – GJK

+0

Я отредактировал мой вопрос. – Crabar

+0

какой ключ вы используете в ответе JSON? Например, если ваша модель является «книгой», то вы хотите, чтобы JSON был «книгами: [{id: 1}, {id: 2}]» и т. Д. (Где id: 1 и id: 2 представляют ваш записи). –

ответ

2

Вы должны добавить пользовательский сериализатор для добавления корневого ключа в данные JSON. Я не проверял это, но вы могли бы попробовать что-то вроде:

(с использованием модели «книги» в качестве примера)

// app/serializers/book.js 
import DS from 'ember-data'; 

export default DS.RESTSerializer.extend({ 
    extractArray: function(store, type, payload) { 
    var newPayload = {}; 
    newPayload[type.modelName] = payload; 
    return this._super(store, type, newPayload); 
    } 
}); 

Если это проблема всего API, то вам, возможно, потребуется создайте собственный сериализатор для всего приложения и используйте аргумент pass-in type для создания корневых ключей.

Также, как примечание, я, вероятно, не использовал бы Ember Data, если бы у меня не было контроля над API. Если это не соответствует строгим правилам, таким как jsonapi.org, у вас обязательно будет несколько головных болей.

EDIT - изменен ответ на предложение выше (используя «тип» для создания корневого ключа).

+0

Да, ваше решение работает после небольшой редакции. 'импортировать DS из 'ember-data'; экспорта по умолчанию DS.RESTSerializer.extend ({ \t extractArray: функция (магазин, тип, полезная нагрузка) { \t вар newPayload = {}; \t newPayload [type.modelName] = полезной нагрузки; \t возврата this._super (магазин, тип, newPayload) \t} }); ' – Crabar

+0

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

4

От http://emberjs.com/api/data/classes/DS.JSONSerializer.html

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

На данный момент существует 4 типа сериализаторов:


Данные JSON у вас есть простой json.

JSONSerializer полезно для более простого или устаревших движков, которые не могут поддерживают http://jsonapi.org/ спецификации

Так что вам нужно JSONSerializer, который является самым простым решением, чтобы потреблять простые данные JSON.
С Ember-кли довольно легко создать новый сериалайзер, например, для модели book:

ember generate serializer book 

, который будет производить что-то вроде этого:

version: 1.13.8 
installing serializer 
    create app/serializers/book.js 
installing serializer-test 
    create tests/unit/serializers/book-test.js 

Предыдущая команда создаст сериалайзер из тип RESTSerializer. (Если вы не используете уголек -cli просто создать этот файл под рукой)

// app/serializers/book.js 
import DS from 'ember-data'; 

export default DS.RESTSerializer.extend({ 
}); 

, а затем изменить RESTSerializer по JSONSerializer:

import DS from 'ember-data'; 

export default DS.JSONSerializer.extend({ 
    primaryKey: '_id', // useful for mongodb-like data 
}); 

Я надеюсь, что вы любите учиться уголек столько, сколько я.

+1

Спасибо за ответ. Теперь у меня следующий сериализатор, и он работает как шарм: https://github.com/drinkit/ember-client/blob/master/app/serializers/application.js – Crabar

0

Я принял еще один подход и перегрузил метод modelNameFromPayloadKey.

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

// app/serializers/<model>.js 
import DS from 'ember-data'; 
import normalizeModelName from "ember-data/-private/system/normalize-model-name"; 
import {singularize} from "ember-inflector"; 

export default DS.RESTSerializer.extend({ 
    model: '<model>', 

    modelNameFromPayloadKey(key) { 
    // Check whether the key is of type integer 
    if (!isNaN(key)) { 
     return normalizeModelName(this.get('model')); 
    } 
    return singularize(normalizeModelName(key)); 
    }, 

});