1

私は 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
4

1 に答える 1

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メソッドはもう必要ありません。andプロパティ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
});

Pageこれにより、2 つの子を持つオブジェクトが作成されます。

オブジェクトを作成するときに関係を定義する方法は 2 つあります。親に子について伝えるか、子に親について伝えるかのいずれかです。両方を伝える必要はありません。ember は関係を同期します。これは、異なるモデル間の関係を定義する場合にのみ適用されます!

編集

getwithを使用してhasMany関係objectAtにアクセスします。

  • 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
}));

実際の例でこのフィドルを参照してください。

于 2013-02-10T14:06:03.933 に答える