问题描述
我在firefox上调试 EXT JS4.0的程序的时候其他的组建如BUTTON ,textfield都能正常显示。。。但是WINDOW就不能。。。查看firefox的控制台。。发现报错一个 this.container is null 的信息。。。。我查找了半天也没找到原因。。请大瞎指点。代码如下Ext.onReady(function(){ var button = new Ext.button.Button({text:"one",width:100,renderTo:Ext.getBody(),listeners:{"click":function(){alert(this.getText());}}}); var _window = new Ext.Window({ layout: { type: 'vbox', align: 'left'}, width:200, height:100, resizable:false, frame:true, border:4, plain:true, title:"测试", items:[ {xtype:"textfield",fieldLabel:"姓名"}, {xtype:"textfield",fieldLabel:"明码"} ], buttons:[ { text:"打开", listeners:{ "click":function(){ alert("打开了"); _window.show(); } } }, { text:"关闭", listeners:{ "click":function(){ alert("关闭了"); _window.hide(); } } } ] }); _window.render(Ext.getBody()); _window.show();//4.0的SHOW方法有三个参数,但是都是可选的,因此我没有穿进去 }); 问题补充:myali88 写道
解决方案
不是结贴么,怎么没动静?我等着呢
解决方案二:
其实你要获取对window组件的引用也很简单,有两个办法:1、因为上面的写法产生了闭包,所以你在listener的方法里面是可以直接访问window的,想这样://...listeners:{"click":function(){alert("打开了");console.log(_window.title);_window.show();}}/...2、采用继承的方式,定制你自己的window。把buttons的赋值放到initCompont里面,这样你就能在函数里获得window的引用(因为initComponent函数的this就是指向window本身),在通过listener的scope属性指定作用域,其实不指定也可以,因为有闭包。最后,建议你既然你使用Extjs 4,那么代码的写法最好按extjs 4的方式来,你上面的写法都是extjs 3的。我使用extjs也才2个月,没什么好资料,都是看看API,看看官方的例子,然后自己改。
解决方案三:
什么是组件!就是搭积木一样,一个附在另一个上面,window内部也会使用其他组件的啊,不是说你给window设置了“button”属性,那么这些button就直接添加到window上来了,具体要看window组件本身是怎么实现的,Extjs文档里面也说得很清楚了。就是把button先添加到toolbar组件上,然后再把toolbar组件添加到了window上,所以可以像你说的引用还是说就间接的证明了我的BUTTON根本就没有附着在window上面。。。。?(这个概率不高吧) 但不是不在,只是不是直接在window上而已。引用这个概率不高吧这是什么意思?我不明白!没什么概率问题,Extjs里面Window组件的实现就是这样的,buttons属性中的button都是添加到toolbar上的。
解决方案四:
我说的子容器不是子类!虽然你new的是Window,但是你是把你的按钮添加到了“buttons”属性里面,而不是window本身。引用bbar : Object/ArrayThe bottom toolbar of the panel. This can be a Ext.Toolbar object, a toolbar config, or an array of buttons/button configs to be added to the toolbar.看看Extjs文档的说明,buttons里的组件被添加到了toolbar组件里面,这里的toolbar作为Window的bbar属性存在的!其实你要知道“this.ownerCt”到底是谁,知道通过:console.log(this.ownerCt)就能看得出来。
解决方案五:
引用但是没有显示当前panel的title 显示的是undefined 。。。能不能告诉我下这是因为,buton的父容器并不是window,而是window的子容器:tbar,tbar本身没有定义这个title属性引用且我发现个问题。。一些属性或者配置或者方法文档里面没有。。但是可以用。。。。这个就有点费力了。。。是不是官方文档没写全啊。还是说是故意的有什么用意?? 你使用的属性和方法最好是文档里有的,这些属性对我们来说属性API,extjs不会轻易改变的,而其他属性虽然你可以使用,但属于extjs内部的接口,不能保证将来它不会改变。因为js并没有像java这样的语法级别的访问控制,所以你能访问到这些内部的属性和方法。
解决方案六:
你用有问题的机子,访问一个官网上的windows的例子,看看有没有同样的问题,如果没有,那说明还是代码的问题。
解决方案七:
我试过了,没问题啊!你用这个试试:Ext.require([ '*' ]);Ext.onReady(function(){var button = new Ext.button.Button({text:"one",width:100,renderTo:Ext.getBody(),listeners:{"click":function(){alert(this.getText());}}}); var _window = new Ext.Window({layout: {type: 'vbox',align: 'left'},width:200,height:100,resizable:false,frame:true,border:4,plain:true,title:"测试",items:[{xtype:"textfield",fieldLabel:"姓名"},{xtype:"textfield",fieldLabel:"明码"}],buttons:[ { text:"打开", listeners:{ "click":function(){alert("打开了");_window.show(); } } }, {text:"关闭",listeners:{"click":function(){alert("关闭了");_window.hide();}} } ] }); _window.render(Ext.getBody()); _window.show();//4.0的SHOW方法有三个参数,但是都是可选的,因此我没有穿进去 });