2008-10-20 93 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。让我知道如果这是你的目标,我完全错过了这一点。 ;)