我刚刚开始在EmberJS中尝试定义导航结构。
我想有一个也有子页面的页面对象。我如何在数据结构中将它们联系起来?
这是我到目前为止所拥有的:
App.Page = DS.Model.extend({
title: attr('string', { defaultValue:''}),
url: attr('string', { defaultValue:''}),
defaultPage: attr('boolean', { defaultValue:false}),
parentPage: attr('string', { defaultValue:''}),
children: attr('string', { defaultValue:''}),
position: attr('string', { defaultValue:'left'}),
getChildren:function(){
return App.NavigationController.filterProperty('parentPage',this.get('title'));
}
});
到目前为止,我正在使用它:
this.pushObject(App.Page.createRecord({
title: "Page",
url: "/page"
}));
this.pushObject(App.Page.createRecord({
title: "Child of Page",
url: "/child_of_page",
parentPage: "Page"
}));
任何指针?
使用示例进行编辑:
我正在尝试你的建议但收到的却是:
pPg = App.Page.createRecord({title:'Page1'});
pPg.get('childen').pushObject(App.Page.createRecord({title:'cPage1', parentPage:pPg}));
// output TypeError: Cannot call method 'pushObject' of undefined
var cPg1 = App.Page.createRecord({title:'cPage1', parentPage:pPg});
var cPg2 = App.Page.createRecord({title:'cPage2', parentPage:pPg});
pPg.get('children').objectAt(0);
// outputs undefined
pPg.get('children').objectAt(1);
// outputs undefined
答案 0 :(得分:1)
我认为,就像您与其他模特有关一样:使用belongsTo
和hasMany
:
App.Page = DS.Model.extend({
title: attr('string', { defaultValue:''}),
url: attr('string', { defaultValue:''}),
defaultPage: attr('boolean', { defaultValue:false}),
parentPage: DS.belongsTo('App.Page'),
children: DS.hasMany('App.Page'),
position: attr('string', { defaultValue:'left'})
});
不再需要getChildren
方法,只需使用children
和parentPage
属性:
var parentPage = App.Page.createRecord({
title: "Page",
url: "/page"
});
parentPage.get('children').pushObject(App.Page.createRecord({
title: "Child of Page",
url: "/child_of_page"
}));
var anotherChild = App.Page.createRecord({
title: "Child of Page",
url: "/child_of_page",
parentPage: parentPage
});
这将创建一个包含2个孩子的Page
对象。
在创建对象时,有两种方法可以定义关系 - 要么告诉父级有关子级的信息,要么告诉孩子有关父级的信息,不需要同时告诉他们 - ember将同步关系。 这仅适用于您定义不同模型之间的关系!
使用get
与objectAt
一起访问 hasMany 关系:
parentObj.get('children')
- 让所有孩子。请注意,这不是常规JS数组,而是Ember.Array
,因此没有[ ]
运算符。parentObj.get('children').objectAt(1)
- 获得特定的孩子。当您处理与同一模型的关系时,您需要告诉父母和孩子他们之间的关系:
var parent = App.Page.createRecord({
title: "Page",
url: "/page"
});
parent.get('children').pushObject(App.Page.createRecord({
title: "Child of Page",
url: "/child_of_page",
parentPage: parent
}));
请参阅this fiddle的工作示例。