2012-06-16 47 views
0

產生干將我試圖創建基本控制器,並寫在它:ExtJS的4.1控制器的繼承與商店和模型

Ext.define('My.Users.controller.Role', { 
    extend  : 'Ext.app.Controller', 
    stores  : [ 
     'Modules', 'ModulesList' 
    ], 
    models  : [ 
     'Modules', 'ModulesList' 
    ] 
}); 

但是當我試圖用干將爲他們(在這個基類,或者它的子類,如My.Users.controller.Group),如getModulesStore()或getModulesListModel(),我有一個錯誤,他們不是函數。在Firebug中,我可以看到在子類和它的超類中沒有這種方法。我該如何解決它?

的完整描述如何重現此錯誤: 1)煎茶

2下載的ExtJS 4.1 GPL)解壓縮檔案,並進入ExtJS的目錄-4.1.0 /例子/應用/饋瀏覽器/

3)在文件feed-viewer.html註釋行<script type="text/javascript" src="all-classes.js"></script>中強制加載js文件:現在您可以正常編輯項目文件的內容。

4)在文件夾中的應用程序/控制器創建名爲Entities.js文件與以下代碼:

Ext.define('FV.controller.Entities', { 
    extend: 'Ext.app.Controller', 
    models: ['Shared'], 
    stores: ['Shared'] 
}); 

5)在文件Articles.js和Feeds.js改變延伸到 'FV.controller.Entities'

6)在文件夾中的應用程序/模型和應用程序/存儲創建內容文件Shared.js

Ext.define('FV.model.Shared', { 
    extend: 'Ext.data.Model', 
    idProperty: 'id', 
    fields: [ 
    { 
     name: 'id', 
     type: 'int' 
    }, 
    { 
     name: 'title', 
     type: 'string' 
    } 
    ] 
}); 

型號和

Ext.define('FV.store.Shared', { 
    extend: 'Ext.data.Store', 
    model: 'FV.model.Shared', 
    proxy: { 
     type: 'ajax', 
     url: 'test.json', 
     reader: { 
      type: 'json', 
      root: 'item' 
     } 
    } 
}); 

適用於商店。 7)最後,例如,在Article.js的init方法中嘗試console.log(this); 在Firebug中,您不會得到getSharedModel()和getSharedStore()方法。

我,如果你正在使用refs財產上傳了我的樣品http://nekaka.com/d/W1_EOlnPST

+0

你的代碼看起來正確的給我,所以有可能在店裏模型,你正在嘗試使用的名稱/ ID不匹配。 – JohnnyHK

回答

1

modelsstores的配置屬性。如果你看看Ext.app.Controller的來源,你會看到在構造函數中創建的getters。

FV.controller.Articles固有的從你的控制器類,但它有自己的modelsstores屬性將覆蓋你自己的基類。這與你的組件具有height配置的方式非常相似,它將覆蓋所有基類的基本類(除非基類通過在構造函數或initComponent中覆蓋它來強制這樣的配置,這與使用簡單的controller不同配置屬性)。

如果你想要這個工作,你的控制器固有的類將不得不顯式合併基類配置和新類型。再次,像組件一樣。

或者(也許是一個更好的解決方案),而不是定義共享模型並將其作爲配置屬性存儲在您的基類中,您可以將它們合併到構造函數獲取的配置中。像這樣的事情在你的控制器基類的構造函數:

Ext.merge(config, { 
    models: ['Shared'], 
    stores: ['Shared'] 
}); 
+0

解析器吃我的標籤:)我編輯我的帖子。 是的,我甚至不會考慮重寫我的模型和商店 - 我認爲它會在getters被覆蓋之前創建getters。萬分感謝。 –

2

消氣劑的意見產生。

http://docs.sencha.com/ext-js/4-0/#!/api/Ext.app.Controller - 查看「使用參考」一節。

對於門店只使用this.getStore('Modules')

+0

我詢問了有關生成的getter,而不是獲取(entityName)方法。 –

+0

@GuyFawkes生成的getter被稱爲get ,它們用於檢索視圖。這個答案是正確的!沒有爲模型生成的getter,它們僅用於動態加載。 –

+0

@sha要使這個'this.getStore('Modules')'工作,您必須使用該ID創建它,否則將創建一個新的全局商店,其ID爲'Modules'。 –