Wicket:如何在不丢失现有输入的情况下重新呈现当前表单?

发布于 2024-10-07 21:43:39 字数 1229 浏览 1 评论 0原文

我有一个带有组合框/下拉菜单的表单来选择用户语言。如果用户更改语言,我想更新所有标签,但保留输入元素。

在 jQuery 中,我会通过 JSON 请求标签 ID 和新文本的列表,然后使用如下循环:

var texts = {[ {id:'nameLabel', text:'First Name'}, {id:'familyLabel', text:'Family Name'} ]};
for( var i=0; i<texts.length; i++) {
    var item = texts[i];
    $('#'+item.id).text(item.text);
}

这将更新所有标签而不修改任何其他内容。我如何在 Wicket 中执行此操作?

[编辑]我尝试过的:

        DropDownChoice<Locale> ddc = new DropDownChoice<Locale>(...);
        ddc.add( new AjaxFormComponentUpdatingBehavior("onchange") {
            private static final long serialVersionUID = 1L;

            @Override
            protected void onUpdate( AjaxRequestTarget target ) {
                getSession().setLocale( language );
                for( MarkupContainer label : labels ) {
                    target.addComponent( label );
                }
            }
        });

这确实改变了标签,但它也再次呈现所有输入字段。我发现无法访问输入字段的当前值。

[EDIT2] 标签列表的创建方式如下:

        StringResourceModel usernameLabel = new StringResourceModel("usernameLabel", this, new Model<ValueMap>(map));
        labels.add(add(new Label("usernameLabel", usernameLabel)));

I have a form with a combobox/drop down to select the user language. If the user changes the language, I'd like to update all the labels but leave the input elements alone.

In jQuery, I'd request a list of label IDs and the new texts via JSON and then use a loop like this:

var texts = {[ {id:'nameLabel', text:'First Name'}, {id:'familyLabel', text:'Family Name'} ]};
for( var i=0; i<texts.length; i++) {
    var item = texts[i];
    $('#'+item.id).text(item.text);
}

That would update all the labels without modifying anything else. How do I do this in Wicket?

[EDIT] What I tried:

        DropDownChoice<Locale> ddc = new DropDownChoice<Locale>(...);
        ddc.add( new AjaxFormComponentUpdatingBehavior("onchange") {
            private static final long serialVersionUID = 1L;

            @Override
            protected void onUpdate( AjaxRequestTarget target ) {
                getSession().setLocale( language );
                for( MarkupContainer label : labels ) {
                    target.addComponent( label );
                }
            }
        });

This does change the labels but it also renders all the input fields again. I found no way to access the current values of the input fields.

[EDIT2] The list of labels is created like so:

        StringResourceModel usernameLabel = new StringResourceModel("usernameLabel", this, new Model<ValueMap>(map));
        labels.add(add(new Label("usernameLabel", usernameLabel)));

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

审判长 2024-10-14 21:43:39

这是错误的:

labels.add(add(new Label("usernameLabel", usernameLabel)));

您没有将 Label 实例添加到“标签”,而是重复添加您要添加​​到的容器(可能是 Page 实例)。方法“add()”不返回正在添加的组件,它返回要添加组件的容器。

尝试将其更改为:

Label label = new Label("usernameLabel", usernameLabel);
add(label);
labels.add(label);

This is wrong:

labels.add(add(new Label("usernameLabel", usernameLabel)));

You're not adding Label instances to 'labels', it's repeatedly adding the container you are adding it to (probably the Page instance). The method 'add()' doesn't return the component being added, it returns the container you are adding the components into.

Try changing it to:

Label label = new Label("usernameLabel", usernameLabel);
add(label);
labels.add(label);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文