2010-10-18 82 views
0

我正在实现Wicket IBehavior接口,并希望我的行为从onComponentTag方法更改组件的主体(或以某种方式更新模型)。 有没有办法做到这一点?Wicket:从IBehavior :: onComponentTag更改组件主体

@Override 
public void onComponentTag(final Component component, final ComponentTag tag) 
{ 
    String myValue = tag.getAttribute("myAttribute"); 

    // TODO: Based on the value of this attribute, update the body/model of the component 


    super.onComponentTag(component, tag); 
} 

编辑:我想抓住从指定的元件允许的最大字符数,如果需要,然后以编程截断元件的主体的HTML的属性。

例子:

<span wicket:id="myLabel" maxChars="10">The body of my tag</span> 

将被替换成:

<span wicket:id="myLabel" maxChars="10">The bod...</span> 

回答

2

您或许能够从组件获取模式,正从模型中的对象并进行任何修改要做到这一点你需要在物体上,但onComponentTag不是改变模型的最佳工作场所。

在呈现过程中,您的页面可能已被部分呈现时,将调用此方法。已经呈现的页面的任何部分都将以模型的先前状态呈现。由于模型可以在组件之间共享,因此您的结果页面可能不一致。

如果您试图更改渲染的正文,那是另一回事,并且在此方法中完成合理的工作。它通常涉及调用ComponentTag tag参数的方法。

您试图通过创建此行为来解决什么问题?也许我们可以想出更好的方法。

编辑:

修剪的标签上显示的特定情况下,你可能会提供更好的服务,只需大约需要继承Label组件,如下所示:

public class TrimmedLabel extends Label { 
    private int size; 

    public TrimmedLabel(String id, int size) { 
     super(id); 
     this.size = size; 
    } 

    public TrimmedLabel(String id, String label, int size) { 
     super(id, label); 
     this.size = size; 
    } 

    public TrimmedLabel(String id, IModel model, int size) { 
     super(id, model); 
     this.size = size; 
    } 

    @Override 
    protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) { 
     String value = getModelObjectAsString(); 
     if (value.length() > size) { 
      value = value.substring(0, size); 
     } 
     replaceComponentTagBody(markupStream, openTag, value); 
    } 
} 
+0

我想指定HTML中标签主体允许的最大字符数,然后获取该值并可能截断文本。 – Clayton 2010-10-18 22:54:41

+0

我希望将这个功能封装在一个可应用于各种组件的行为中,但基于我的研究,我认为这是不可能的。 – Clayton 2010-10-19 16:33:48

2

从快速入门http://wicket.apache.org/start/quickstart.html派生我的建议是这样的:

add(new Label("message", "If you see this message wicket is properly configured and running") { 

     @Override 
     protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) { 
      String myAttrib = openTag.getAttribute("myAttrib"); 
      replaceComponentTagBody(markupStream, openTag, getDefaultModelObjectAsString().substring(0, Integer.valueOf(myAttrib))); 
     } 

    }); 

不要忘记看NumberFormat Exc尽管如此。

另外donroby的建议做所有aply。如果不需要的话,不要混淆模型。

+0

+1:这可能比我的更新,因为我正在从Wicket 1.3安装工作。 – 2010-10-19 11:31:05