2008-10-20 11 views
4

我在Wicket組件中封裝了一個Javascript小部件。我想讓JS方與組件交談。到目前爲止,我已經得到了什麼:在問題Wicket + Javascript

組件出現像

talker = new GridAjaxBehavior(); 
this.add(talker);  

在構造

,然後,後來,把像

"var MyGridTalker = new talker(" + this.talker.getCallbackUrl() + ");"; 

到JS。

其中GridAjaxBehavior延伸AbstractDefaultAjaxBehavior。我想讓GridAjaxBehavior在JS調用它時吐出一些XML。

我這樣做是正確的嗎? GridAjaxBehaviour應該怎樣回吐XML?

感謝

+0

僅供參考,您的javascript散發出現錯誤。你錯過了右手paren和分號,但是你還缺少提供的字符串引號。 ... ...新的談話人(\「」+ this.talker.getCallbackURL()+「\」);「;或類似的東西。 – davenpcj 2008-10-20 15:43:19

回答

0

我真的不知道什麼是檢票或它做什麼,但有一個小錯誤在你的代碼(因爲它出現)。

此:

"var MyGridTalker = new talker(" + this.talker.getCallbackUrl();

你似乎缺少您的最終括號:

"var MyGridTalker = new talker(" + this.talker.getCallbackUrl() + ")";

反正不是什麼大不了的事,但不知道它是否是故意的。

1

爲什麼吐一些XML?大概是更新模型或視圖,是嗎?

Wicket的優勢在於您不必擔心呈現的HTML。在Model-View-Controller術語中,您將Controller設置爲正確修改Model,Wicket負責View。

分離不是完全是明確:事實上,您可以顯示/隱藏視圖組件,或更改,然後可以視爲更改視圖。

但是你通常不需要做的就是直接管理瀏覽器或javascript。 Wicket會照顧到這一點,如果你照顧你在Java代碼中的修改。

在Wicket中,Ajax將使用AjaxRequestTarget目標在您的AjaxBehavior上調用一個方法。

在該方法中(或從其中調用的方法中),您可以執行任何需要執行的操作,更新模型或視圖,然後向目標添加已更改的任何視圖組件。 Wicket負責更新瀏覽器。


下面是一個例子。它取自我的一些代碼,但嚴重改變只是爲了使說明更清晰。這個想法很簡單:「鏈接」下拉選擇,其中當父項中的選擇選項更改時,子項中的選項發生更改,如在[州] [縣] [區]系列中。

(在實際的類中,模型的變化傳遞給了孩子,孩子自己決定是否已經改變了,並且自己添加到了目標中,然後將目標傳遞給它的孩子。大部分是做一個更清晰的例子)

這裏的構造函數,這只是增加了自身的AjaxBehavior的匿名子類:

public AjaxChildNotifyingDropDownChoice(...code elided for clarity...) { 
    this.child = child; 

    // Ajax won't work without this: 
    setOutputMarkupId(true); 
    // 
    add(new OnChangeAjaxBehavior() { 
     @Override 
     public void onUpdate(final AjaxRequestTarget target) { 

      // tell child to update its list 
      // based on newly selected value 

      // when the Ajax is called, 
      // my owning component's model 
      // is already updated 

      // note we could just type getModel() 
      // I'm making explicit that we're calling it 
      // on the enclosing class 
      // (which a non-static inner class has a hidden ref to) 
      child.setNewModelBasedOnSelectionOf( 
       AjaxChildNotifyingDropDownChoice.this.getModel()); 

      // now add the child to the target 
      // Wicket javascript will receive the new 
      // options and re-render the child dropdown 
      target.add(child); 

     } 
    }); 
} 

我們還可以隱藏或取消隱藏成分,或添加像CSS樣式的行爲,甚至將一個Panel換成另一個Panel。只要對每個更改的組件我們: 1)調用setOutputMarkupId(true);從而使JavaScript可以找到它, 2)把它添加到AjaxRequestTarget

注意,阿賈克斯行爲的不同類型(subclases)有不同的回調函數,所以要確保你覆蓋了正確的(加一個@如果名稱錯誤,覆蓋註釋以便編譯器可以投訴)。

但是,基本檢票的想法是,您不必爲客戶端發送原始數據來解析並採取行動,而是更新模型和視圖,並告訴Wicket重新呈現已更改的內容,方法是添加chnaged組件到目標。

我能想到發送直接XML的唯一原因是要將它提供給非Wicket javascript。讓我知道如果這是你的目標,我完全錯過了這一點。 ;)