Can Model与EmberJS中的相同模型类型有关系

时间:2013-02-08 05:12:48

标签: ember.js

我刚刚开始在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

1 个答案:

答案 0 :(得分:1)

我认为,就像您与其他模特有关一样:使用belongsTohasMany

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方法,只需使用childrenparentPage属性:

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将同步关系。 这仅适用于您定义不同模型之间的关系!

修改

使用getobjectAt一起访问 hasMany 关系:

  • parentObj.get('children') - 让所有孩子。请注意,这不是常规JS数组,而是Ember.Array,因此没有[ ]运算符。
  • parentObj.get('children').objectAt(1) - 获得特定的孩子。

编辑2

当您处理与同一模型的关系时,您需要告诉父母和孩子他们之间的关系:

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的工作示例。