我想在chooseQuery方法执行的最后调用search()函数,而search()要引用生成的输入框的值,然而我的代码程序每次执行的时候,当调用search()时,输入框中的值还未设进去,即每次得到的值是空的.但是设置输入框的方法明明在search()函数之后执行的。而我确定值有设进去。是不是和上下文有关?
/**
 * @param data
 * @return
 */
function chooseQuery(data)
{
var methodCount = dojo.query("input[type='radio']");
for (var i = 0; i < methodCount.length; i++)
{
if (methodCount[i].checked)
{
var optionValue = methodCount[i].value;
                        // queryName是一个FilteringSelect 改变它的选项
queryName.attr("value",optionValue,false);
                        // 根据变化的选项值创建不同的输入框或下拉框
selectQuery();
                        // 初始化显示grid的面板
initGridPane();
                        // 将值设置到生成的输入框中
addElementToDialogById(optionValue,data);
queryName._lastValueReported=null;
dijit.byId("availableQueriesDialog").hide();
dijit.byId("queriedConcept").attr("style", "display:none;");
break ;
}
}
        // 根据值进行查找
        search();
}
selectQuery();的代码如下
function selectQuery() 
{
 intiParamPane();
 var datatr = dojo.byId("datatr");
 qnStore.fetch
 (
{
// search items by condition
query : 
{
name :queryName.value
},
onComplete : function(items, request) 
{
if ((qnStore.getValues(items[0],"parameter")).length > 0)
{
var properties = qnStore.getAttributes(items[0]);
// hold all of the values for the parameter
var parameters = qnStore.getValues(items[0], properties[1]);
// hold all of the types for parameter
var types = qnStore.getValues(items[0], properties[2]);
// judge the parameter whether is needed
var requires = qnStore.getValues(items[0], properties[3]);
// if has regular 
var regulars = qnStore.getValues(items[0], 'regular');
for (var i = 0; i < parameters.length; i++)
{
document.getElementById("inputDiv").setAttribute("class", "inputDiv");
if (types[i]  == "array")
{
createSelectElement(datatr, parameters[i],requires[i], types[i]);
}
else
{
createInputElement(datatr, parameters[i], requires[i], regulars[i]); }
}
}
}
}
 );
}
search()函数代码如下
function search()
{
var queryName = dojo.byId('queryName').value;
var flag = validateParameter(queryName);
if (flag)
{
return;
}
initGridPane();
var dialog = (dijit.byId("waitDialog") == null ? showWaitingDialog() : (dijit.byId("waitDialog"))) ;
dialog.show();
qnStore.fetch
({
// search items by condition
query : 
{
name :queryName
},
onComplete : function(items, request) 
{
var properties = qnStore.getAttributes(items[0]);
// hold all of the values for the parameter
var parameters = qnStore.getValues(items[0], properties[1]);
// hold every params
var params = "?method="+queryName;
for (var i = 0; i < parameters.length; i++)
{
var attribute = parameters[i];
var _value = dojo.byId(parameters[i]).value;
params += "&"+attribute+"="+_value;
}
console.log(browser_action_name + params);
dojo.xhrGet
(
  {
 handleAs: 'json',
 url: browser_action_name + params,
 load:showResult,
 error:availableQueriesDialog
  }
)
    }
});
}

解决方案 »

  1.   

    function search()
    {
        var queryName = dojo.byId('queryName').value;
       if(queryName ==""){
    setTimeout(search,10);
    return;
    }

        var flag = validateParameter(queryName);
        if (flag)
        {
            return;
        }
    }
      

  2.   

    0,弱问一下,queryName.attr("value",optionValue,false);这第三个参数false是干嘛的?一般只看到dojo.attr()有第三个参数,widget.attr()不是只有两个参数的吗
    1,queryName在chooseQuery方法中似乎是一个widget,取值的时候为什么不直接用queryName.attr("value")呢
    2,selectQuery是一个异步的方法,queryName的值和onComplete的handler有关吗?如果有关的话就要把search的调用connect到qnstore的onComplete事件上面去
      

  3.   


    对啊,就是有关,但貌似我没有找到方法可以将search和onComplete 联系起来,毕竟onComplete是fetch函数的内部的方法