4

我正在将一个Javascript小部件包装在一个Wicket组件中。我想让 JS 方面与组件对话。到目前为止我得到了什么:

有问题的组件就像

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

在构造函数中

然后,稍后,放一些类似的东西

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

进入JS。

在哪里GridAjaxBehavior延伸AbstractDefaultAjaxBehavior。我希望 GridAjaxBehavior 在 JS 调用它时吐回一些 XML。

我这样做对吗?GridAjaxBehaviour 应该怎么做才能吐回 XML?

谢谢

4

2 回答 2

1

吐出一些 XML 做什么?大概是为了更新模型或视图,是吗?

Wicket 的优势在于您不必担心呈现的 HTML。在模型-视图-控制器术语中,您设置控制器以正确修改模型,而 Wicket 负责视图。

分离并不完全清楚:实际上您可以显示/隐藏视图组件,或者然后更改,这可以看作是更改视图。

但是您通常不必做的是直接管理浏览器或javascript。如果您注意在 Java 代码中进行更改,Wicket 会处理这些。

在 Wicket 中,Ajax 将使用 AjaxRequestTarget 目标调用 AjaxBehavior 上的方法。

在该方法(或从它调用的方法中)中,您可以做任何您需要做的事情,更新模型或视图,然后将任何已更改的视图组件添加到目标中。Wicket 负责更新浏览器。


这是一个例子。它取自我做的一些代码,但为了使解释更清楚而进行了大量修改。这个想法很简单:“链式”下拉选择,当父项中的选择选项发生变化时,子项中的选项会发生变化,如 [州] [县] [区] 的系列。

(在实际的类中,模型更改被传递给孩子,孩子自己决定是否发生了变化,如果有,则将自己添加到目标中,然后将目标传递给它的孩子。我已经删除了大部分举个更清楚的例子。)

这是 ctor,它只是给自己添加了一个 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 样式等行为,甚至将一个面板换成另一个面板。只要对于每个更改的组件,我们: 1) 调用 setOutputMarkupId(true); 以便 javascript 可以找到它,并且 2) 将其添加到 AjaxRequestTarget

请注意,Ajax 行为的不同类型(子类)具有不同的回调函数,因此请确保您覆盖了正确的回调函数(添加一个 @Override 注释,以便编译器在名称错误时会抱怨)。

但同样,基本的 wicket 想法是,不是将原始数据发送给客户端进行解析和操作,而是更新模型和视图,并告诉 Wicket 重新渲染您所做的更改,方法是将已更改的组件添加到目标。

我能想到直接发送 XML 的唯一原因是将其提供给非 Wicket javascript。让我知道这是否是你的目标,我完全错过了重点。;)

于 2009-04-04T17:29:27.067 回答
0

我真的不知道 Wicket 是什么或它做了什么,但您的代码中有一个小错误(如它所显示的那样)。

这个:

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

你似乎错过了你的结束括号:

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

反正没什么大不了的,但不知道是不是故意的。

于 2009-04-03T11:23:46.127 回答