【问题标题】:How to change text label in wicket如何更改检票口中的文本标签
【发布时间】:2020-05-21 04:07:02
【问题描述】:

我正在尝试使用 AjaxLink 更改检票口中按钮上的文本,但它不起作用,请问有什么帮助吗?这是我的代码;

<form name="depForm" wicket:id="depSummaryForm" action=""> 
<div class="uw_summary"> <div class="buttonContainer"> 
<span class="button_v2" wicket:id="newRecruitContainer"> 
<button class="internal_button" wicket:id="newRecruitEWLButton" 
type="button"> Create New Recruit EWL </button> </span> 

final WebMarkupContainer newRecruitContainer = new 
WebMarkupContainer("newRecruitContainer")
{
Label buttonlabel = new Label("newRecruitEWLButton", Model.of(" "));
buttonlabel.setOutputMarkupPlaceholderTag(true);

AjaxLink newRecruitEWLButton = new AjaxLink("newRecruitEWLButton") { 
@Override public void onClick(AjaxRequestTarget target) { 
buttonlabel.setDefaultModelObject(Model.of("Creating EWL")); 
target.add(buttonlabel); boolean isWorkItemCreated = 
NewRecruitEWLUtil.createNewRecruitWorkItem(appInfo); } };  

【问题讨论】:

    标签: wicket


    【解决方案1】:

    您需要更新Label的模型,而不是添加新的Label。

    WebMarkupContainer xyzContainer = new WebMarkupContainer("xyzContainer") {
    
       @Override
       public void onConfigure() {  // [1]
          super.onConfigure();
          boolean isVisible = some code goes here
          setVisible(isVisible);
       }
    };
    
    final Label buttonlabel = new Label("clickMe", ""); // [2]
    buttonlabel.setOutputMarkupId(true); // [3]
    
    AjaxLink xyzButton = new AjaxLink("xyzButton") {
       @Override
       public void onClick(AjaxRequestTarget target) {         
           buttonlabel.setModelObject("Clicked")); // [4]
           target.add(buttonlabel);
       }
    };
    
    
    xyzContainer.add(xyzButton);
    Form.add(xyzContainer);
    

    以下是我建议的更改:

    1. 使用 onConfigure() + setVisible() 因为 isVisible() 被多次调用,并且取决于“一些代码在此处”的昂贵程度,它可能会影响整体性能
    2. 设置初始标签 - 空字符串
    3. setOutputMarkupPlaceholderTag() 应在组件可以设置为不可见时使用。如果它始终可见,那么 setOutputMarkupId(true) 就足够了
    4. 使用 Component.setModelObject(...) 设置同一 Label 实例的新值

    更新: 以下是您的代码的外观:

    <form name="depForm" wicket:id="depSummaryForm"> 
       <div class="uw_summary"> 
         <div class="buttonContainer"> 
           <span class="button_v2" wicket:id="newRecruitContainer"> 
             <button class="internal_button" wicket:id="newRecruitEWLButton" 
    type="button">
     <span wicket:id="label">Create New Recruit EWL</span></button> 
           </span>
         </div>
       </div>
    </form>
    
    
    final WebMarkupContainer newRecruitContainer = new 
    WebMarkupContainer("newRecruitContainer");
    
    Label buttonlabel = new Label("label", Model.of(" "));
       buttonlabel.setOutputMarkupPlaceholderTag(true);
    
       AjaxLink newRecruitEWLButton = new AjaxLink("newRecruitEWLButton") 
       { 
          @Override public void onClick(AjaxRequestTarget target) { 
              buttonlabel.setDefaultModelObject(Model.of("Creating EWL")); 
              target.add(buttonlabel); 
              boolean isWorkItemCreated = 
                 NewRecruitEWLUtil.createNewRecruitWorkItem(appInfo); } 
       };
       newRecruitContainer.add(newRecruitEWLButton);
       newRecruitEWLButton.add(buttonlabel);
    

    【讨论】:

    • 感谢马丁的回复。我在上面实现了你的建议,除了 Component.setModelObject(...),setModelObject 对我不可用,所以我使用了 setDefaultModelModelObject。但是,我收到错误 - IllegalArgumentException: 一个 id 为 'xxxxxxxxx' 的孩子已经存在。我猜是因为我对 AjaxLink 和标签使用了相同的检票口 id ???我这样做是因为您提到这是我将要更新的组件,并且不需要在 onClick 中创建新标签???请指教。谢谢。
    • 1) setDefaultModelModelObject - 您使用 Wicket 1.4 或更早版本。 2) A child with id 'xxxxxxxxx' - xxxxxxxx 到底是什么? AjaxLink 的 id 是 'xyzButton',标签的 id 是 'clickMe' ?或者,也许您希望 Label 的初始值为“clickMe”?!您需要使用这些组件的 HTML 部分更新您的问题,以使其更清晰。
    • 请更新问题。 cmets 中的代码不可读。
    【解决方案2】:

    在 html 文件中使用 div 作为按钮标签而不是 span 有效,并从 onclick setDefaultModel(); 调用此方法;此方法在这种情况下不起作用 - setDefaultModelModelObject()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多