一般来说,获取控件相关的值的时候,如果马上执行js代码,经常会获取不到,但是如果加一个延时setTimeout
就可以获取到准确的值。
今天发现一个问题,代码如下
//延时执行以下代码
setTimeout(function() {
//获取当前tab条的的数字,0表示tab1,1表示tab2
var index=_g().getWidgetByName("tabpane0").getShowIndex();
//获取需要存储值的控件
var label=this.options.form.getWidgetByName("textEditor0");
//将需要存储值的控件的值设置为0+tab条的值,默认为0
label.setValue(0+index,true);
}, 10);
或者
//获取当前tab条的的数字,0表示tab1,1表示tab2
var index=_g().getWidgetByName("tabpane0").getShowIndex();
//获取需要存储值的控件
var label=this.options.form.getWidgetByName("textEditor0");
//延时执行以下代码
setTimeout(function() {
//将需要存储值的控件的值设置为0+tab条的值,默认为0
label.setValue(0+index,true);
}, 10);
这样的代码本来需要实现的效果是,切换到tab1时,控件值为0,切换到tab2时,控件值为1,以此类推。
但是发现实际情况中,前者的情况是无论怎么切换tab,控件的值都没改变。后者的情况是虽然改变了,但是一直有明显的报错提示var index=_g().getWidgetByName("tabpane0").getShowIndex();
这行代码有问题。
请教别人后,代码修改为
//延时执行以下代码
setTimeout(function() {
//获取当前tab条的的数字,0表示tab1,1表示tab2
var label=_g().getWidgetByName("textEditor0");
//获取需要存储值的控件
var index=_g().getWidgetByName("tabpane0").getShowIndex();
//将需要存储值的控件的值设置为0+tab条的值,默认为0
label.setValue(0+index,true);
}, 10);
或者
//获取需要存储值的控件
var label = this.options.form.getWidgetByName("textEditor0");
//延时执行以下代码
setTimeout(function() {
//获取当前tab条的的数字,0表示tab1,1表示tab2
var index = _g().getWidgetByName("tabpane0").getShowIndex();
//将需要存储值的控件的值设置为0+tab条的值,默认为0
label.setValue(0 + index, true);
}, 10);
这样就没有任何问题了。
我发现实践中,获取控件一般是没什么问题的,但是获取和控件有关的值经常会有问题,需要使用延时才能获取正确的值。
setTimeout
是一个独立的方法体,在里面使用this.options.form
,就会获取不到控件。如果需要在setTimeout
里获取控件,就得用_g()
。所以,this.options.form
需要放在外面才能正确获取控件。
_g()
获取控件值,就可以放在setTimeout
里使用。获取值的时候若不延时,会导致值变化的不如取数快,取的数通常不对,所以需要放在setTimeout
里才能正确获得控件的值。
因此,在setTimeout
里获取值用_g()
,在外面获取则用this.options.form
。