我希望能够从服务器处理函数访问动态创建的小部件的标记。
这是一个在运行时创建5个checkBox的简单示例。我想在服务器处理程序中访问它们的标签。
function doGet() {
var app = UiApp.createApplication();
var mainPanel = app.createVerticalPanel();
var handler = app.createServerHandler('myClickHandler');
for(var i=0; i<6; ++i) {
var newCheckBox = app.createCheckBox()
.setId('cBox' +i)
.setName('cBox' +i)
.setText('checkBox ' +i)
.setTag('cBox' +i +' was clicked');
newCheckBox.addValueChangeHandler(handler);
mainPanel.add(newCheckBox);
}
var label = app.createLabel()
.setId('statusLabel')
.setVisible(false);
mainPanel.add(label);
handler.addCallbackElement(mainPanel);
app.add(mainPanel);
return app;
}
在这个例子中,我喜欢名为&#39; statusLabel&#39;的标签文本。设置为单击的复选框的标记。
我知道如果我直接使用小部件的名称,我可以在服务器处理程序中读取标签,如下例所示:
function myClickHandler(e) {
var app = UiApp.getActiveApplication();
label.setText(e.parameter.cBox1_tag)
label.setVisible(true);
app.close();
return app;
}
但我想做的是能够用这样的东西拉出源代码的标签
statusLabel.setText(e.parameter.source_tag);
但是失败了。我也试过了
var cBoxNum = e.parameter.source(e.parameter.source.length -1);
var cBoxName = 'cBox' +xBoxNum;
statusLabel.setText(e.parameter.cBoxName_tag)
或
var cBoxNum = e.parameter.source(e.parameter.source.length -1);
var cBoxName = 'cBox' +xBoxNum +'_tag';
statusLabel.setText(e.parameter.cBoxName)
所有这些方法都返回&#39; undefined&#39;。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:0)
在这种情况下,您应该使用不同的语法。
使用括号来获取带有“重建”字符串的参数值。
像这样:var tagValue = e.parameter[e.parameter.source+'_tag'];
您的功能为online test here
function doGet() {
var app = UiApp.createApplication();
var mainPanel = app.createVerticalPanel();
var handler = app.createServerHandler('myClickHandler');
for(var i=0; i<6; ++i) {
var newCheckBox = app.createCheckBox()
.setId('cBox' +i)
.setName('cBox' +i)
.setText('checkBox ' +i)
.setTag('cBox' +i +' was clicked');
newCheckBox.addValueChangeHandler(handler);
mainPanel.add(newCheckBox);
}
var label = app.createLabel()
.setId('statusLabel')
.setVisible(false);
mainPanel.add(label);
handler.addCallbackElement(mainPanel);
app.add(mainPanel);
return app;
}
function myClickHandler(e) {
var app = UiApp.getActiveApplication();
var label = app.getElementById('statusLabel');
label.setText(e.parameter[e.parameter.source+'_tag'])
label.setVisible(true);
return app;
}