6

私はかなり長い間、hasMany と belongsTo の使用方法を理解するのに苦労してきました。私の理解では、hasMany は 1 対多の関係で、 begsToは多対 1 の関係です。私はそれに関するいくつかの記事を読みました:

それでも少し混乱しています。次のデータがあるとします。

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": [{}]
      }]
  }
};

config のモデルを作成します。

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 はオブジェクトの配列であるため、Config は多くの Someconfig を持つことができます。Someconfig モデルは次のとおりです。

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

わかりました、同じ取引です。データでは、タブはオブジェクトの配列であるため、someconfig は多くのタブを持つことができます。タブモデルは次のとおりです。

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

今、このプロパティをいじっていたので、begsTo がそこにあります。とにかく、Someconfig からタブにアクセスすることはできませんが、Config から Someconfig にアクセスすることはできます。このコードを見てください:

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

jsFiddle :デモ

私が知りたいのは、someconfig( )からtabs()にアクセスできるべきではないか、それとも関係を誤解しているのでしょうか? 前者の場合、コードを修正するにはどうすればよいですか?

Sencha フォーラムからクロスポストされました。

4

1 に答える 1

5

ここでのアプローチにはいくつか問題があります。

  1. 1対多の関係のgetterを呼び出すと、実際には一連の関連オブジェクトを含むStore オブジェクトへの参照を取得しているため、ストアの関係タブを取得しようとしても意味がありません。
  2. リレーションシップ ストアから1 つの要素を取得し、その特定のインスタンスの一連のタブを含む Store オブジェクトを返すtabs メソッド呼び出して、関連するタブを取得する必要があります。
  3. 関連するタブのいずれかにアクセスしたい場合は、そのストアから単一のオブジェクトを再度選択する必要があります。関係ツリー全体を横切るには、次のようにする必要があります。
someconfig = record.someconfig().getAt(0);
sometab = someconfig.tabs().getAt(0);

動作するコードの修正版を次に示します。問題の解決に役立つことを願っています。

于 2013-10-25T07:48:31.083 に答える