我有一个视口,它有两个内容:菜单和主要内容。在菜单项的点击事件期间,我收到此错误:Uncaught TypeError: newCard.fireEvent is not a function
navigate
功能缺少什么?以下是View
和Controller
;
的MainView:
Ext.define('CalTable.view.MainView', {
extend: 'Ext.container.Viewport',
alias: 'widget.mainview',
requires: [
'Ext.menu.Menu',
'Ext.menu.Item',
'Ext.form.Label'
],
itemId: 'mainView',
layout: 'border',
defaultListenerScope: true,
items: [
{
xtype: 'panel',
region: 'west',
split: true,
itemId: 'menuPanel',
width: 150,
title: 'Menu',
items: [
{
xtype: 'menu',
floating: false,
itemId: 'menu',
items: [
{
xtype: 'menuitem',
itemId: 'home',
text: 'Home',
focusable: true
}, {
xtype: 'menuitem',
itemId: 'folioList',
text: 'Folio List',
focusable: true
}, {
xtype: 'menuitem',
itemId: 'calendar',
text: 'Calendar',
focusable: true
}
],
listeners: {click: 'onMenuClick'}
}
]
}, {
xtype: 'panel',
region: 'center',
itemId: 'contentPanel',
layout: 'card',
scope: this,
items: [
{
xtype: 'panel',
itemId: 'homePanel',
title: 'Home',
layout: {
type: 'vbox',
align: 'center',
pack: 'center'
},
items: [
{
xtype: 'label',
text: 'Home View'
}
]
}, {
xtype: 'panel',
itemId: 'folioPanel',
title: 'Folio List',
layout: {
type: 'vbox',
align: 'center',
pack: 'center'
},
items: [
{
xtype: 'label',
text: 'Folio List View'
}
]
}, {
xtype: 'panel',
itemID: 'calendarPanel',
title: 'Calendar',
layout: {
type: 'vbox',
align: 'center',
pack: 'center'
},
items: [
{
xtype: 'label',
text: 'Calendar View'
}
]
}
]
}
],
onMenuClick: function(menu, item, e, eOpts) {
location.hash = item.itemId;
}
});
当然还有控制器:
Ext.define('CalTable.controller.TheController', {
extend: 'Ext.app.Controller',
requires: ['Ext.util.History'],
refs: {
contentPanel: '#contentPanel',
menu: '#menu',
menuPanel: '#menuPanel'
},
onLaunch: function () {
Ext.History.init();
Ext.History.on('change', this.navigate, this);
this.navigate(window.location.hash);
},
navigate: function (id) {
if (id) {
if (id[0] == '#') id = id.slice(1);
this.getContentPanel().layout.setActiveItem(id + 'Panel');
this.getMenu().items.each(function (item) {
if (item.href == '#' + id) {
item.disable();
window.document.title = item.text;
}
else {
item.enable();
}
});
}
}
});
答案 0 :(得分:2)
错误是由此行引起的:
this.getContentPanel().layout.setActiveItem(id + 'Panel');
因为根本问题是菜单项和卡片的ID必须匹配。
您有菜单项
home
folioList
calendar
但您在卡片布局中的ID是
homePanel
folioPanel
calendarPanel
因此,当单击标识为folioList
的菜单项并随后执行setActiveItem("folioListPanel")
时,但不存在标识为folioListPanel
的项目时,ExtJS中会抛出这个模糊的错误。
虽然更改id应该可以解决手头的问题,但你肯定还想做的是修改控制器以在导航之前检查项目是否真的存在,因为导航也可以通过用户更改的锚点执行,并且你不希望你的用户以这种方式破坏你的应用程序。