我在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方法有三个参数,但是都是可选的,因此我没有穿进去
});
不是结贴么,怎么没动静?我等着呢
我试过了,没问题啊!你用这个试试:
[code="java"]
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方法有三个参数,但是都是可选的,因此我没有穿进去
});
[/code]
你用有问题的机子,访问一个官网上的windows的例子,看看有没有同样的问题,如果没有,那说明还是代码的问题。
[quote]但是没有显示当前panel的title 显示的是undefined 。。。能不能告诉我下[/quote]
这是因为,buton的父容器并不是window,而是window的子容器:tbar,tbar本身没有定义这个title属性
[quote]
且我发现个问题。。一些属性或者配置或者方法文档里面没有。。但是可以用。。。。这个就有点费力了。。。是不是官方文档没写全啊。还是说是故意的有什么用意??
[/quote]
你使用的属性和方法最好是文档里有的,这些属性对我们来说属性API,extjs不会轻易改变的,而其他属性虽然你可以使用,但属于extjs内部的接口,不能保证将来它不会改变。因为js并没有像java这样的语法级别的访问控制,所以你能访问到这些内部的属性和方法。
我说的子容器不是子类!虽然你new的是Window,但是你是把你的按钮添加到了“buttons”属性里面,而不是window本身。
[quote]
bbar : Object/Array
The bottom toolbar of the panel. This can be a Ext.Toolbar object, a toolbar config, or [b]an array of buttons/button configs to be added to the toolbar[/b].
[/quote]
看看Extjs文档的说明,buttons里的组件被添加到了toolbar组件里面,这里的toolbar作为Window的bbar属性存在的!
其实你要知道“this.ownerCt”到底是谁,知道通过:[code="java"]console.log(this.ownerCt)[/code]就能看得出来。
什么是组件!就是搭积木一样,一个附在另一个上面,window内部也会使用其他组件的啊,不是说你给window设置了“button”属性,那么这些button就直接添加到window上来了,具体要看window组件本身是怎么实现的,Extjs文档里面也说得很清楚了。就是把button先添加到toolbar组件上,然后再把toolbar组件添加到了window上,所以可以像你说的
[quote]
还是说就间接的证明了我的BUTTON根本就没有附着在window上面。。。。?(这个概率不高吧)
[/quote]
但不是不在,只是不是直接在window上而已。
[quote]这个概率不高吧[/quote]这是什么意思?我不明白!没什么概率问题,Extjs里面Window组件的实现就是这样的,buttons属性中的button都是添加到toolbar上的。
其实你要获取对window组件的引用也很简单,有两个办法:
1、因为上面的写法产生了闭包,所以你在listener的方法里面是可以直接访问window的,想这样:
[code="java"]
//...
listeners:{
"click":function(){
alert("打开了");
console.log(_window.title);
_window.show();
}
}
/...
[/code]
2、采用继承的方式,定制你自己的window。把buttons的赋值放到initCompont里面,这样你就能在函数里获得window的引用(因为initComponent函数的this就是指向window本身),在通过listener的scope属性指定作用域,其实不指定也可以,因为有闭包。
最后,建议你既然你使用Extjs 4,那么代码的写法最好按extjs 4的方式来,你上面的写法都是extjs 3的。我使用extjs也才2个月,没什么好资料,都是看看API,看看官方的例子,然后自己改。