2013-10-24 15 views
5

私はhasManyとbelongsToの使い方を理解するのに苦労しています。私の理解はhasManyは1:多くの関係であり、belongsToはmany:1の関係です。脇に:これは、hasMany関係がある場合、その子モデルにbelongsToが必要であることを意味しますか?私はそれについていくつかの記事を読んだ:ExtJS 4:hasManyとbelongsToを理解する

ExtJS Tutorials - HasMany article

  • ExtJS Tutorials - BelongsTo article
  • Association Sample in extjs 4.2:
  • Ext.data.association.HasMany
  • Ext.data.association.BelongsTo
  • まだ少し混乱。のは、私は次のようなデータを持っているとしましょう:

    var data = { 
        "config": { 
        "name": "blah", 
        "id": 1, 
        "someconfig": [{ 
         "name": "Services", "tabs": [{ 
          "id": 0, "name": "Details", "layout": "hbox" 
          }, { 
          "id": 1, "name": "Sources", "layout": "hbox" 
          }, { 
          "id": 2, "name": "Paths", "layout": "hbox" 
          }, { 
          "id": 3, "name": "Ports", "layout": "hbox" 
          }, { 
          "id": 4, "name": "Levels", "layout": "hbox" 
          }, { 
          "id": 5, "name": "Notes", "layout": "hbox" 
          }] 
         }, { 
         "name": "Services2", "tabs": [{}] 
         }] 
        } 
    }; 
    

    私は設定のためのモデルを作成します。

    Ext.define('Config', { 
        extend: 'Ext.data.Model', 
        fields: ['name'], 
        hasMany: [{ 
        name: 'someconfig', 
        model: 'Someconfig', 
        associationKey: 'someconfig' 
        }], 
        proxy: { 
        type: 'memory', 
        data: data, 
        reader: { 
         type: 'json', 
         root: 'config' 
        } 
        } 
    }); 
    

    データで、someconfigは、オブジェクトの配列であるため、だから、コンフィグが多くSomeconfigsを持つことができます。ここにSomeconfigモデルがあります:

    Ext.define('Someconfig', { 
        extend: 'Ext.data.Model', 
        fields: [ 
        'name' 
        ], 
        hasMany: [{ 
        name: 'tabs', 
        model: 'Tabs', 
        associationKey: 'tabs' 
        }] 
    }); 
    

    Ok、同じ取引です。 Someconfigは、データ内でタブがオブジェクトの配列であるため、多くのタブを持つことができます。ここにTabsモデルがあります:

    Ext.define('Tabs', { 
        extend: 'Ext.data.Model', 
        fields: [ 
        'id', 
        'name', 
        'layout' 
        ], 
        belongsTo: [{ 
        name: 'tabs', 
        model: 'Someconfig', 
        associationKey: 'tabs' 
        }] 
    }); 
    

    ここで、私はこのプロパティを使いこなしていたので、belongsToがそこにあります。それにもかかわらず、Someconfigからタブにアクセスすることはできませんが、ConfigからSomeconfigにアクセスできます。 jsFiddle

    Config.load(1, { 
        success: function(record, operation) { 
        console.log(record.get('name')); // works 
        console.log(record.someconfig().getCount()); // works, gives me 2 
        console.log(record.someconfig().data.items[0].data); // only prints out name and config_id 
    //  console.log(record.someconfig().tabs()); // doesn't exist 
        } 
    }); 
    

    :このコードを見てみましょうdemo

    私が知りたいのは何ですが、私は、someconfig()からタブ()にアクセスできないようにする必要がありまたは私は関係を誤解していますか?それが前者の場合、コードを修正するにはどうすればよいですか?

    クロス投稿Sencha forumsから投稿しました。

    答えて

    5

    ここにあなたのアプローチと間違っていくつかのものがあります。

    1. あなたは1対多の関係をゲッターを呼び出すと、あなたが実際にストアオブジェクトへの参照を取得しているが、には関連オブジェクトのセットが含まれているため、ストアのタブの関係を取得しようとすると意味がありません。
    2. あなたは関係ストアから一つの要素を取得し、その後、その特定のインスタンスのためのタブのセットを含むStoreオブジェクトを返しますタブ方式を呼び出すことによって、その関連するタブを取得する必要があります。
    :あなたは 関連のタブのいずれかににアクセスするために をしたい場合あなたは再び は、その店から単一のオブジェクトを選択する必要がありますが、このような何かを行う必要があり、全関係ツリーを横断する
  • someconfig = record.someconfig().getAt(0); 
    sometab = someconfig.tabs().getAt(0); 
    
  • ここにはmodified version of your codeがあります。 あなたの問題を解決するのに役立つことを願っています。

    +0

    あなたはまさに正しいのですが、それは私が昨日やって来た結論です。ありがとう! – incutonez

    +0

    これは興味深いことですが、 'someconfig'は' record'のデータには表示されません...私は 'someconfig'メソッドにアクセスすることしかできません。これは私には意味をなさない... 'config'モデルhasMany' someconfig'が 'config'にモデルの配列として現れるはずです! – incutonez

    関連する問題