2013-04-16 23 views
2

當試圖以編程方式推圖到視口的主導航視圖中,我得到以下錯誤:煎茶觸摸2.1獲取視圖通過參考

遺漏的類型錯誤:對象的翻譯:有沒有一種方法「 getMainPanel」當MainController.js文件中的以下行稱爲:

var mainnav = this.getMainPanel(); 

我只是想通過的xtype得到裁判導航視圖,這樣我可以執行mainnav.push(‘的viewName’)取決於是否有數據調用返回的數據。數據和數據調用工作正常,我可以手動將所需的視圖添加到主視圖端口,導致導航視圖毫無價值,這不是我的意圖。

我曾試圖通過的xtype, 'mainPanel中',也通過分配和ID,ID添加 「參考」: 'mainPanel中',並在控制器嘗試:

refs: { 
     mainPanel: 'MainPanel' 
} 

和編號:

refs:{ mainPanel:'#MainPanel' }

無論如何,錯誤都是一樣的。

僅供參考我試圖遵循下列資源中描述的情形:

http://docs.sencha.com/touch/2.1.1/#!/guide/controllers

http://docs.sencha.com/touch/2.0.2/#!/api/Ext.ComponentQuery

http://www.sencha.com/forum/showthread.php?179143-View-reference-getter-undefined

Sencha Touch 2- Unable to get ref view from controller

Sencha Touch 2.0 Controller refs attribute not working?

Sencha Touch 2.0 and navigation.View - MVC

這裏是我的代碼:

app.js

Ext.application({ 
name: 'AddCharSheet', 
views: ['Main'], 
models: ['CharacterSelectModel'], 
stores: ['CharacterSelectStore'], 
controllers: ['MainController'], 

launch: function(){ 
    Ext.Viewport.add({ 
     xtype: 'MainPanel' 
    }); 
} 
}); 

Main.js

Ext.define('AddCharSheet.view.Main', { 
    extend: 'Ext.navigation.View', 
    requires: ['AddCharSheet.view.CharacterSelect', 'AddCharSheet.view.AddNewCharacter', 'Ext.Toolbar', 'Ext.Panel'], 
    xtype: 'MainPanel', 
    config: { 

    } 
    }); 

MainController.js

Ext.define('AddCharSheet.controller.MainController',{ 
Extend: 'Ext.app.Controller', 

config: { 
    stores: ['AddCharSheet.store.CharacterSelectStore'], 
    models: ['AddCharSheet.model.CharacterSelectModel'], 
    views: ['AddCharSheet.view.AddNewCharacter', 'AddCharSheet.view.CharacterSelect'], 

    refs: { 
     mainPanel: 'MainPanel' 
    }, 
    control: { 

    }, 
    launch: function() { 
    } 
}, 

init: function(){ 
    var chs = Ext.getStore('charSelStore'); 
    var mainnav = this.getMainPanel(); 
    chs.load({ 
     callback: function(recs, operation){ 
      if(this.getCount() > 0){ 
       mainnav.push('CharList'); 
      } 
      else{ 
       mainnav.push('NewCharacter'); 
      } 
     } 
    }); 
} 
}); 

更新Main.js和更新MainController.js

Main.js

Ext.define('AddCharSheet.view.Main', { 
    extend: 'Ext.navigation.View', 
    requires: ['AddCharSheet.view.CharacterSelect', 'AddCharSheet.view.AddNewCharacter', 'Ext.Toolbar', 'Ext.Panel'], 
    xtype: 'MainPanel', 
    config: { 
     itemId: 'mainpanel' 
    } 
}); 

MainController.js

Ext.define('AddCharSheet.controller.MainController',{ 
    Extend: 'Ext.app.Controller', 

    config: { 
     stores: ['AddCharSheet.store.CharacterSelectStore'], 
     models: ['AddCharSheet.model.CharacterSelectModel'], 
     views: ['AddCharSheet.view.AddNewCharacter', 'AddCharSheet.view.CharacterSelect'], 

     refs: { 
      mainPanel: { 
       autoCreate: true, 
       selector: '#mainpanel', 
       xtype: 'MainPanel' 
      } 
     }, 
     control: { 

     }, 
     launch: function() { 
     } 
    }, 

    init: function(){ 
     var chs = Ext.getStore('charSelStore'); 
     var mainnav = this.getMainPanel(); 
     chs.load({ 
      callback: function(recs, operation){ 
       if(this.getCount() > 0){ 
        mainnav.push({xtype: 'CharList'}); 
       } 
       else{ 
        mainnav.push({ xtype: 'NewCharacter'}); 
       } 
      } 
     }); 
    } 
}); 

回答

2

你想的itemId配置分配給您的Main視圖。所以:

Ext.define('AddCharSheet.view.Main', { 
    extend: 'Ext.navigation.View', 
    requires: ['AddCharSheet.view.CharacterSelect', 'AddCharSheet.view.AddNewCharacter',  'Ext.Toolbar', 'Ext.Panel'], 
    xtype: 'MainPanel', 
    config: { 
     ..., 
     itemId: 'mainpanel', 
     ... 
    } 
}); 

然後在您的控制器,您通過ref引用您Main視圖。所以:

Ext.define('AddCharSheet.controller.MainController',{ 
    Extend: 'Ext.app.Controller', 

    config: { 
     stores: ['AddCharSheet.store.CharacterSelectStore'], 
     models: ['AddCharSheet.model.CharacterSelectModel'], 
     views: ['AddCharSheet.view.AddNewCharacter', 'AddCharSheet.view.CharacterSelect'], 

     refs: { 
      mainPanel : { 
       autoCreate: true, 
       selector: '#mainpanel', 
       xtype: 'MainPanel' 
      }, 
     }, 
     control: { 

     }, 
     launch: function() { 

     } 
}, 

init: function(){ 
    var chs = Ext.getStore('charSelStore'); 
    var mainnav = this.getMainPanel(); 
    chs.load({ 
     callback: function(recs, operation){ 
      if(this.getCount() > 0){ 
       mainnav.push('CharList'); 
      } 
      else{ 
       mainnav.push('NewCharacter'); 
      } 
     } 
    }); 
} 

}); 

現在,你應該能夠做到var mainnav = this.getMainPanel();

而且你是推新的意見的方式是錯誤的。當您推送Object時,您通過String。檢查docs

所以你的情況可能要做到這一點:

mainnav.push({ 
    xtype:'CharList' 
}); 

mainnav.push({ 
    xtype:'NewCharacter' 
}); 

假設CharListNewCharacter是各自的意見xtypes

編輯: 好吧,如果你仍然有同樣的問題,這可能是因爲您在init功能這樣做。嘗試將您的邏輯轉移到launch函數。事實證明init函數在應用程序啓動之前被調用。 http://docs.sencha.com/touch/2.1.1/#!/api/Ext.app.Controller-cfg-init

+0

還是一樣在同一地點確切的錯誤,就像當我嘗試指定範圍更廣ID而非條目標識。我注意到需要一個對象而不是字符串。另外,如果我正確理解Ref文檔,那麼您建議的方式應該永遠不會拋出錯誤,因爲autoCreate爲true並且指定了xtype,如果它不能獲取視圖,而不應該創建它的新實例?閱讀下高級裁判[鏈接] http://docs.sencha.com/touch/2.1.1/#!/guide/controllers – SouthPlatte

+0

所以你仍然會得到這個相同的錯誤:'未捕獲TypeError:對象[對象對象]'在線'var mainnav = this.getMainPanel();' – cclerville

+0

是的,同樣的錯誤。我將用新代碼更新原始帖子,以驗證我已正確實施 – SouthPlatte

0

其實,當你調用mainnav = this.getMainPanel();功能的init()內mainPanel中視圖尚未創建,這就是爲什麼你得到不確定的,嘗試用一個單擊處理程序做它,你會看到,會工作,因爲各方面的意見將在點擊的時刻全部創建。

嘗試這樣的事:

Ext.define('IT.controller.UserController', { 
    extend: 'Ext.app.Controller', 
    views: [ 
     'user.authentication' 
    ], 
    refs: [ 
     { 
      ref: 'Authentication', 
      selector: 'Authentication', 
     } 
    ], 
    init: function() { 
     console.log('Initialized Users'); 
     var me = this; 
     me.control(
      { 
       '#login-user-btn': { 
        click: me.handleLoginUser 
       } 
      } 
      ); 
     }, 
    handleLoginUser: function(button, e) { 
     alert('Ok'); 
     //var form= button.up('form').getForm(); 
     var form = this.getAuthentication(); 
     alert(form); 
    } 
})