0

我使用 struts2-jquery-plugin 和 struts2-json-plugin。

我的问题是jQuery 函数在我的动作类中的动作函数之前执行

1) 我的 JSP 页面上定义的 jQuery 函数由onchange=verifyChosenLanguage(this.value)调用。

2)在我的动作类 LanguagesForm.java 中定义的动作函数是loadLanguages,它由onChangeTopics="reloadFrameworks"调用。

3) 在 LanguagesFormAction.java 中,我定义了一个布尔变量 FrameworksExist。因此,如果 DAO 函数告诉我它存在所选语言的框架,我设置FrameworksExist=true,否则为 false。因此,在 jQuery 函数中,我测试 FrameworksExist==true 或 FrameworksExist==false。

但不幸的是,我注意到事件onchange 在 loadLanguages 发送“成功”之前被调用。所以我的函数仍然发现 FrameworksExist==false。

在选择触发的操作函数的返回字符串(成功)之后,我该怎么做才能执行我的 jQuery 函数?

jQuery函数:

function verifyChosenLanguage(value){
  var someText = '<s:property value="FrameworksExist"/>';
  alert(" FrameworksExist = "+someText+"what"); // this gives me always "false"
}

形式的双重选择:

<s:url id="remoteurl1" action="loadLanguages"/>
<sj:select 
  onchange="verifyChosenLanguage(this.value)"                   
  href="%{remoteurl1}"                          
  label="Category "                     
  id="IdChosenLanguage"                 
  name="IdChosenLanguage"   
  onChangeTopics="reloadFrameworks"         
  list="languages"                      
  listKey="lang_id"             
  listValue="lang_name"                     
  emptyOption="false"                           
  headerKey="None"                          
  headerValue="Select a language"
/> 

<s:url id="remoteurl2" action="loadLanguages"/> 
<sj:select                                      
  href="%{remoteurl2}"
  label="Framework "                        
  id="IdChosenFramework"
  name="IdChosenFramework"                  
  formIds="formLanguages"           
  reloadTopics="reloadFrameworks"                   
  list="frameworks" 
  listKey="frame_id"                        
  listValue="frame_name"                    
  emptyOption="false"                           
  headerKey="None"                          
  headerValue="Select a Framework"
/>

LanguagesFormAction.java:

@Actions( {
  @Action(value = "/loadLanguages", results = {
    @Result(name = "success", type = "json")
  })
})
public String loadLanguages(){

  // instructions
  if ( (languageDAO.countFrameworks(Long.valueOf(IdChosenLanguage)!=0){
    FrameworksExist=true;
  }
  else{
    FrameworksExist=false;
  }
  // instructions
  return "success";
}
public String getJSON()
{
   return loadLanguages();
}
4

1 回答 1

0

FrameworksExist加载 JSP 时会评估 jQuery 函数中的值。 请记住,您使用了常规的 struts2 属性标记,它不能基于对操作的 ajax 调用神奇地更改或重新加载其值。

function verifyChosenLanguage(value){
  var someText = '<s:property value="FrameworksExist"/>'; // <-- Evaluated on first load of your JSP
  alert(" FrameworksExist = "+someText+"what"); // Does not change based on ajax calls      
}

loadLanguages操作仅更改您的<sj:select>项目的值,因为这就是它所适用的全部。loadLanguages按您的方式调用不会更新 JSP 页面上的所有值

编辑:

如果您想FrameworkExists从您的选择输入交互中获取价值,您可以通过执行以下操作订阅适当的主题:

$.subscribe('topicName', function(event,data) {
    // Parse for and prcess your FrameworkExists data here as you wish.
});

您可以在演示站点上查看带有 JSON 结果的远程链接的示例。

于 2012-08-11T19:40:43.240 回答