Ответ 1
Есть несколько вещей, которые мешают вашей скрипке работать:
-
функция
DS.hasMany
запрашивает аргумент String. Не забудьте цитаты:DS.hasMany('Node')
-
в определении приспособления, отношения
hasMany
не должны быть добавлены с помощью_ids
или что-либо еще. Просто используйте простое имя. Например:{ id: 42, children: [2,3], parent_id: 17 }
-
свойство
length
DS.ManyArray
должно быть доступно с помощью функцииget
:root.get('children.length')
-
по умолчанию адаптер адаптера имитирует вызов ajax. Запрос
find
будет заполнять запись после ожидания 50 мс. В вашей скрипке вызовroot.get('children.length')
приходит слишком рано. Вы можете настроить адаптер адаптера так, чтобы он выполнял синхронный вызов:App.store = DS.Store.create({ revision: 4, adapter: DS.FixtureAdapter.create({ simulateRemoteResponse: false }) });
Или вы можете загружать данные в хранилище без какого-либо адаптера:
App.store.loadMany(App.Node, [ { id: 1, children: [2, 3] }, { id: 2, children: [], parent_id: 1 }, { id: 3, children: [], parent_id: 1 } ]);
-
и последний: похоже, приложение Ember должно быть объявлено в глобальной области (no
var
), а модели данных Ember-данных должны быть объявлены в области приложения (заменяяvar Node = ...
наApp.Node = ...
)
Полный пример:
App = Ember.Application.create();
App.store = DS.Store.create({
revision: 4
});
App.Node = DS.Model.extend({
children: DS.hasMany('App.Node'),
parent: DS.belongsTo('App.Node')
});
App.store.loadMany(App.Node, [
{ id: 1, children: [2, 3] },
{ id: 2, children: [], parent_id: 1 },
{ id: 3, children: [], parent_id: 1 }
]);
var root = App.store.find(App.Node, 1);
alert(root.get('children'));
alert(root.get('children.length'));