2015-01-13 2 views
3

Я действительно не понимаю, что здесь ...Ember-данные: Deserialize встроенный модель

У меня есть следующий код:

App.Instance = DS.Model.extend({ 
    hash: DS.attr('string'), 
    users: DS.hasMany('user', { embedded: 'always' }) 
}); 

App.User = DS.Model.extend({ 
    name: DS.attr('string'), 
    color: DS.attr('string'), 
    lat: DS.attr('number'), 
    lng: DS.attr('number'), 
    instance: DS.belongsTo('instance') 
}); 

App.InstanceSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, { 
    attrs: { 
    users: { embedded: 'always' } 
    } 
}); 

И пример, как так:

var instance = { 
    hash: "68309966ec7fbaac", 
    id: "54b4518fcbe12d5160771ebe", 
    users: [{ 
    color: "#9E463C", 
    id: "78b662bc56169a96", 
    lat: 36.5299487, 
    lng: -6.2921774, 
    name: "User 1" 
    },{ 
    color: "#9E463C", 
    id: "78b662bc56169a96", 
    lat: 36.5299487, 
    lng: -6.2921774, 
    name: "User 2" 
    }] 
} 

Но когда я хочу store.push('instance', instance);, я получаю:

Uncaught Error: Assertion Failed: Ember Data expected a number or string to represent the record(s) in the users relationship instead it found an object. If this is a polymorphic relationship please specify a type key. If this is an embedded relationship please include the DS.EmbeddedRecordsMixin and specify the users property in your serializer's attrs

Где ошибка?

Чтение из всех этих источников, которые всегда используют другую стратегию:

Спасибо много

+0

В объекте экземпляра есть ошибки. Посмотрите на строку id и пропущенную запятую. Кроме того, указание идентификатора вашего экземпляра и пользователей может испортить хранилище. Попытайтесь изменить эти идентификаторы на новый атрибут, который представляет, на самом деле этот идентификатор. – rogMaHall

+0

Спасибо за ответ. Ошибки экземпляра были копированием опечатки с консоли. Я попытался удалить идентификатор пользователя, но это не поможет. Если я удалю идентификатор из экземпляра, я получаю сообщение «Неиспользуемая ошибка: утверждение не выполнено: вы должны включить идентификатор, например, в объект, переданный push». –

ответ

-1

Как из этой статьи: http://mozmonkey.com/2013/12/loading-json-with-embedded-records-into-ember-data-1-0-0-beta/ Эмбер хочет бокнуть загрузить данные следующим образом:

var data = { 
    instance: { 
    hash: "68309966ec7fbaac", 
    id: "54b4518fcbe12d5160771ebe", 
    users: ["78b662bc56169a96", "78b662bc56169a97"] 
    }, 
    users: [{ 
    color: "#9E463C", 
    id: "78b662bc56169a96", 
    lat: 36.5299487, 
    lng: -6.2921774, 
    name: "User 1" 
    },{ 
    color: "#9E463C", 
    id: "78b662bc56169a96", 
    lat: 36.5299487, 
    lng: -6.2921774, 
    name: "User 2" 
    }] 
} 

Здесь легко сделать:

for (var i=0; i < data.users.length; i++) { 
    store.push('user', data.users[i]); 
} 
store.push('instance', data.instance); 
+4

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

0

создать Serialize внутри папки сериализованном. Имя для сериализации - это то же самое, что и ваша модель.

import DS from 'ember-data'; 

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, { 
    hasEmbeddedAlwaysOption: function(attr) { 
     var option = this.attrsOption(attr); 

     if (typeof(option) === 'undefined') { 
      return true; 
     } else if (option.embedded === false) { 
      return false; 
     } 

     return this._super.apply(this, arguments); 
    }, 

    noSerializeOptionSpecified: function(attr) { 
     var option = this.attrsOption(attr); 

     if (typeof(option) === 'undefined') { 
      return false; 
     } else if (option.embedded === false && !!option.serialize) { 
      return true; 
     } 

     return this._super.apply(this, arguments); 
    } 
}); 

Это происходит, когда у вас есть объекты внутри объекта. Если вы не хотите создавать класс, подобный этому для каждой модели, которую вы имеете с объектами внутри объектов, скопируйте этот код в папку application.js внутри сериализаторов.