2016-03-19 9 views
0

AJAX経由で更新する必要があるコンポーネントがあるWicketページがあります。WicketコンポーネントはAJAX経由でリフレッシュされません

private class MyAjaxBehavior extends AbstractDefaultAjaxBehavior { 

     @Override 
     public void renderHead(IHeaderResponse response) { 
      super.renderHead(response); 
      response.renderOnLoadJavascript("wicketAjaxPost(\"" + getCallbackUrl() + "\")"); 
     } 

     @Override 
     public void onConfigure(Component component) { 
      firstComponent.setOutputMarkupId(true); 
      secondComponent.setOutputMarkupId(true); 
     } 

     @Override 
     protected void respond(AjaxRequestTarget target) { 
      firstComponent.replaceWith(createFirstComponent()); 
      target.addComponent(firstComponent); 

      secondComponent.replaceWith(createSecondComponent()); 
      target.addComponent(secondComponent); 
     } 
    } 

そして、私はこのようなコンポーネントの階層があります:私は、次のAjaxBehaviorを持って

Page 
- fragment1 
    - fragment1-1 
    - firstComponent 
- secondComponent 

問題がfirstComponentは、AJAXコールバックの後にリフレッシュされることはありませんが。 secondComponentが正しく更新されます。私はfirstComponentframent1-1に移動しようとしましたが、それはうまくいきました!私はfirstComponentを包むためにいくつかの余分な断片を使用しようとしましたが、それは役に立たなかった。

私はWicketのAjaxRequestTarget.respondComponent()をデバッグしようとしました。次のコードがあります:

 // Initialize temporary variables 
     final Page page = component.findParent(Page.class); 
     if (page == null) 
     { 
      // dont throw an exception but just ignore this component, somehow 
      // it got 
      // removed from the page. 
      // throw new IllegalStateException(
      // "Ajax request attempted on a component that is not associated 
      // with a Page"); 
      LOG.debug("component: " + component + " with markupid: " + markupId + 
       " not rendered because it was already removed from page"); 
      return; 
     } 

pagefirstComponentsecondComponent何とか再レンダリングされる二番目の両方のために、ここではnullです。

firstComponentはなぜ再レンダリングされないのですか?どこを掘るべきですか?私はWicket 1.4.22を使用します。

UPD

私はtargetではなく、古いものに新しいコンポーネントを追加しようとしました。ページに新しいコンポーネントが作成されますが、古いコンポーネントは更新されません。だから私は1つのページの代わりに2つのコンポーネントを持っています。また、何らかの理由でHTMLマークアップ構造が壊れてしまいます。このように:

<div> 
    <table class="summary" style="width: 100%"> 
     <tr> 
      <div wicket:id="firstComponent" /> 
     </tr> 
    </table> 
</div> 

... 

<wicket:fragment wicket:id="firstComponentFragment"> 
    <th>title</th> 
    <td><span wicket:id="someText"></span></td> 
</wicket:fragment> 

ですから、新しいコンポーネントがテーブルの外に追加され見ることができます。

<div> 
    <div id="generated">new component is added here</div> 
    <table> 
     ... 
     <tr>old component</tr> 
    </table> 
</div> 

firstComponentのための私の改札マークアップは次のようになります。あなたは<table>タグ内<div>を持つことができない、またはブラウザは、テーブルの外に更新マークアップを追加します:

@Override 
protected void respond(AjaxRequestTarget target) { 
    Component old = firstComponent; 
    firstComponent = createFirstComponent(); 
    old.replaceWith(firstComponent); 
    target.addComponent(firstComponent); 
} 

更新:

+2

AjaxEventBehavior( "domready")を使用すると、domが準備完了したときに自動的にイベントが発生します。 – svenmeier

+0

最後に私はJavascriptでこれを解決しました。 :( – coolguy

答えて

0

は、新しく作成したコンポーネントを更新する必要があります。

+0

私のコードとの唯一の違いは、新しいコンポーネントが 'target'に追加されたことです(古いものではありません)。私はこのようにしましたが、新しいコンポーネントをページに追加して古いものをリフレッシュしません私のHTMLマークアップの間違った場所に新しいコンポーネントを追加します。私は答えを更新しました。見てください.Btw、私の 'secondComponent'を使って、' target'に古いコンポーネントを追加し、正しくリフレッシュします。 – coolguy

+0

私はあなたが答えを更新したと信じています。実際に 'table'の中で' div'を使用していないのですが、それはウィッケットの断片を定義する方法なので、 ' ... 'と書かれています。このコンポーネントを初めてページに追加するときに' createFirstComponent() 'を初めて使うときです。 Wicketのバグのようなものです。 – coolguy

+0

Wicket 1.4.xを使用しているようです。公式にサポートされているバージョンは6.xと7.xです。その間にバグが修正された可能性があります。あなたはアップグレードすることをお勧めします! –

1

場合によっては、親コンポーネント(フォーム自体)をajaxレスポンスターゲットに追加する方が簡単なので、その下のすべてが更新されることが確実です。したがって、重複または欠落した更新はありません。特別なコンポーネントの更新は、そのような場合にパフォーマンスが必要な場合にのみ必要です。古いマークアップが確実に削除されるように更新するラッパーコンテナを定義することはできますが、

関連する問題