我有一个从主 html 文件加载的 app.js 文件。现在这个 app.js 文件在单击其中定义的链接时,使用 Ext.require() 动态加载第二个 js 文件。加载正常,因为我已经定义了 Ext.Loader.setPath() 等,第二个脚本包含诸如 Ext.require() 之类的行来导入一些 ui 库,然后是 onReady(),我的问题是永远不会触发 onReady,我不能将小部件渲染代码放在 onReady() 之外。onReady 仅适用于脚本的同步加载吗?
非常感谢
onReady 只会为您的应用程序触发一次。
如果您查看文档,您会看到 Ext.require() 可以采用回调函数:
Ext.require('My.foo.Bar', function() {
console.log('do something');
});
http://docs.sencha.com/extjs/4.2.0/#!/api/Ext-method-require
正如 Evan 所说,Ext.onReady 只会在第一次加载 HTML 页面时触发。
如果您使用 ExtJS 4,那么从 app.js 加载脚本通常会落入 MVC 模式。
这实际上意味着您的控制器是从您的 app.js 初始化的,然后这些控制器负责处理您通常放在 onReady() 中以将函数绑定到事件的代码。“视图”的概念是您放置小部件代码的地方。
例如
应用程序.js
Ext.application({
name: 'MyApp',
appFolder: '/MyApp/Scripts',
autoCreateViewport: true,
requires: [
//data
'ALES.controller.MyController',
]
});
MyController.js
Ext.define('ALES.controller.MyController', {
extend: 'Ext.app.Controller',
id: 'MyController',
views: [
'MyView'
],
stores: [
'MyStore'
],
init: function () {
this.control(
{
'panel > button': { click: this.myClickHandler }
});
});
MyView.js
Ext.define('MyApp.view.MyView', {
extend: 'Ext.form.Panel',
id: 'MyView',
requires: [
'Ext.grid.plugin.CellEditing' //or other Ext stuff you want to include
],
constructor: function (config) {
this.initConfig(config);
return this.callParent(arguments);
},
initComponent: function () {
Ext.apply(this, {
items: this.createControls()
});
this.callParent();
},
createControls: function() {
return [{
xtype: 'panel',
items: [{
xtype: 'button'
}]
}
];
}
});
这些是 sencha 网站上的一些不错的指南,我建议您通读以更深入地了解:
http://docs.sencha.com/extjs/4.1.3/#!/guide/application_architecture