【问题标题】:Wicket: How can I rerender the current form without losing existing input?Wicket:如何在不丢失现有输入的情况下重新呈现当前表单?
【发布时间】:2010-12-16 10:11:21
【问题描述】:

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

在 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)));

【问题讨论】:

  • 在这一行中:for( MarkupContainer label : labels ) 什么是标签,您如何获得它?
  • Labels 是页面上所有标签的列表。代码见 EDIT2。

标签: ajax forms internationalization wicket preserve


【解决方案1】:

这是错误的:

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

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

尝试将其更改为:

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

【讨论】:

  • 你是对的。我还需要打电话给label.setOutputMarkupId( true );,但现在,它完美无缺!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 2019-06-04
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多