2012-08-08 32 views
25

我很困惑哪一個我需要用於up()down()和Ext.getCmp(ID)之間的grep對象。向上()和向下()與Ext.getCmp()

對我而言,將ID定義爲對象並通過Ext.getCmp('ID') 檢索對象並且代碼看起來更乾淨更容易。

例如:

console.log(this.up('panel').up('panel').down('grid')); 
console.log(Ext.getCmp('myPanel')); 

其中之一是獲得更好的性能?

+0

getCmp對於性能可能更好。如果你要使用getCmp,你應該使用UUID。表演不是一切。 – 2012-08-09 16:39:27

回答

34

有嚴重的陷阱使用ID和getCmp來查找您的組件。主要問題是您無法安全地重用組件,因爲在大多數情況下,標記會創建帶有重複ID的HTML元素,這是無效的HTML。此外,當您有兩個具有相同ID的組件時,您將遇到難以跟蹤的意外行爲,因爲框架無法正確引用組件。

這裏有幾個博客和論壇帖子,以及J. Garcia關於此主題的視頻。建議使用getCmp的方法僅用於調試,切換到其他方法(上,下,參考,itemIdComponentQuery),以便生產就緒代碼。

+8

我可以給出一個對比的觀點:我認爲在'id'旁邊放置'組件重用'和'具有相同ID的兩個組件'這個詞很奇怪 - 它已經多次喊出一個ID必須是唯一的。我是關心DOM外觀的人之一,所以有很多ID和ItemIds只是不會獲得ExtJS給出的自動生成的ID。我只是認爲,使用ExtJS的事實並不意味着大猩猩風格的DOM。 – Izhaki 2012-08-09 11:40:47

+2

無論如何,鑑於這是被接受的答案併爲了其他人的利益,我認爲問題的標題應該改爲「我應該或不應該使用ExtJS的ID」。我覺得表現是關鍵問題。 – Izhaki 2012-08-09 11:42:09

+1

Izhaki,我同意你的'司法'在適當的情況下使用ID。我自己將它們用於視口組件的核心佈局。但看看這個問題 - 太多人不明白使用組件ID及其對DOM和應用程序行爲的影響。 – dbrin 2012-08-09 16:32:51

15

Ext.getCmp()內部使用哈希映射,因此它照明速度快,幾乎與基於鍵的數組中的值一樣快。

.up()down()是使用遍歷組件層次結構來實現的,這是一個較慢的過程。

但是up()down()使用選擇器,因此它們也可以選擇類,而不僅僅是id。

您只需要記住,您可能想要使用up()down()的各種情況,例如有多個控件的常用處理程序,或者您之後的組件是由框架自動生成時所以你不能自己給它一個ID。

+0

我聽說使用getCmp不是一個好習慣,因爲如果你需要訪問這個對象,你應該可以很容易地在控制器中獲取它。我意識到有些情況下,這只是無效,但我只是說我聽到的。 – incutonez 2012-08-08 21:04:52

+0

好吧,當然,當使用MVC框架時,您可能會看到'Ext.getCmp()'和'refs'及其相應getter的更多用法。但我認爲這更像是一個造型業務,而不是任何事情。使用refs的另一個好處是,如果你改變一個組件的id,你只需要在refs中更新它,其中'getCmp()'你需要做一個代碼庫搜索替換。 – Izhaki 2012-08-08 21:08:58

+0

是的,這是我聽說使用MVC框架更好的另一個原因。我的意思是,如果可以的話,使用它是有道理的,但正如我所說的,有時你必須使用getCmp。 – incutonez 2012-08-08 21:35:01