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 かどうかをテストします。

しかし、残念なことに、loadLanguages が「成功」を送信する前に onchange イベントが呼び出されることに気付きました。そのため、私の関数は引き続き 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

FrameworksExistjQuery 関数の値は 、JSP のロード時に評価されます。通常の 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 ページのすべての値が更新されるわけではありません

編集:

select 入力インタラクションからの値を取得したい場合はFrameworkExists、次のようにして適切なトピックにサブスクライブできます。

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

デモ サイトで、JSON Result を使用したリモート リンクの例を確認できます。

于 2012-08-11T19:40:43.240 に答える