2014-07-16 96 views
1

許多-to-many關聯這個問題已經被問過兩次,在這樣:實現在ExtJS的4

但無論這些問題有一個實際的回答,所以我會再試一次!

比方說,我有兩種型號,UserGroup。用戶可以處於多個組中,並且組可以包含許多用戶。下面是User型號代碼:

Ext.define('User', { 
    extend: 'Ext.data.Model', 
    alias: 'model.User', 
    fields: [ 
     {name: 'username', type: 'string'}, 
     ... 
    ], 
    proxy: { 
     // Omitted for brevity... 
    }, 
}); 

而且Group

Ext.define('Group', { 
    extend: 'Ext.data.Model', 
    alias: 'model.Group', 
    fields: [ 
     {name: 'name', type: 'string'}, 
     ... 
    ], 
    proxy: { 
     // Omitted for brevity... 
    }, 
}); 

現在,讓我們說我想要一個網格,其中列出我的羣,並讓我雙擊該用戶的組和編輯是在第二個網格中的該組中。

我們還要說每組有很多用戶,所以我不想在加載組時加載所有關聯的用戶。

我希望能夠獲得特定組的用戶存儲,並將其提供給我的網格,該網格將根據需要加載數據(使用網格通常的分頁方式)。

我在這裏看到兩種可能的方法。還有另一種更好的方法,但我會概述我在下面做過的嘗試。

中間模型

  • 添加另一個加盟模式
  • UserGroup添加hasMany協會該模型
  • 從我加盟模式返回的途中添加belongsTo協會UserGroup

加入型號代碼:

Ext.define('GroupUsers', { 
    extend: 'Ext.data.Model', 
    alias: 'model.GroupUsers', 
    fields: [ 
     {name: 'group_id', type: 'int'}, 
     {name: 'user_id', type: 'int'}, 
    ], 
    associations: [ 
     {type: 'belongsTo', model: 'User'}, 
     {type: 'belongsTo', model: 'Group'} 
    ], 
    ... 
}); 

協會Group

associations: [ 
    {type: 'hasMany', model: 'GroupUsers', name: 'group_users'} 
], 

我現在能夠訪問的GroupUsers商店特定Group

group.group_users() 

這種方法的問題在於,我不能僅將GroupUsers的商店綁定到我的第二個網格,因爲我想顯示諸如用戶名的內容。我可以迭代商店的商品,使用getUser()獲取每個User對象,將它們添加到另一個商店,然後將其用於我的網格,但會導致服務器請求每個商品!或者,我可以直接使用我的GroupUsers商店,但之後需要對渲染器執行某些操作,而我仍然需要單獨獲取各個User

直接關聯

  • User並與hasMany協會每個

協會上GroupGroup直接:

associations: [ 
    {type: 'hasMany', model: 'User', name: 'users', foreignKey: '???'} 
], 

我現在可以得到的實際商店User個對象爲一組給定:

group.users() 

這將是巨大的,但沒有什麼對我來說,設置關聯的foreignKeyUser不能有group_id字段,因爲User可以有多個Group

+0

我看到它的方式,讓我們假設我們有商店信息與結構GroupId,GroupName,UserId,UserName(聯合商店所有記錄使用聯接提取)。假設我們有一個網格來顯示按GroupId分組的記錄並顯示組列表,當展開時顯示該組下的用戶列表。現在,假設按鈕點擊將重新排列商店並更新網格顯示以顯示用戶列表,當展開時顯示用戶所在的組列表。這背後的邏輯總體可能是通過商店的filterBy和分組網格功能來實現的 –

+0

@MohammadAftabUddin感謝您的建議,但它並沒有真正回答這個問題,我確實說過我不想預先加載所有數據。 –

+0

這可能對您沒有任何解決方案,但僅用於記錄,[ManyToMany](http://docs.sencha.com/extjs/5.0.0/apidocs/#!/api/Ext.data.schema.ManyToMany) ExtJS 5支持關聯。 – matt

回答

3

也許這是不是你尋找答案,但是這是我會怎麼解決這個問題:

我不會鏈接組和用戶的ExtJS店協會,而是在服務器端。

在您的網格控制器把這樣的事情:

init: function(){ 
    this.control({ 
     'grid': {itemdblclick: this.onGridItemdblclick} 
    }) 
}, 
onGridItemdblclick: function(grid, record){ 
    var group_id = record.getId(), 
    usersStore = this.getStore('Users'); 
    usersStore.load({params: {group_id: group_id}}); 
    var win = Ext.widget('UsersGrid'); // adapt the code to your naming scheme 
    win.show(); 
} 

加載Users店的要求將一個額外的參數group_id發送。在服務器端,您可以使用這個額外的參數來過濾用戶。