我已经开始学习Wicket框架,我遇到了wicket模型,我读到了Model(),CompouneModel()和CompoundPropertyModel(),但我没有得到它们之间的实际区别。我在Google上搜索了这个,但我没有得到任何关于此的信息。
这个link给出了CompoundPropertyModel和PropertyModel之间的描述,但仍然不能正确区分差异。
只有我可以区分Model和其他两个的东西是模型不能用于动态字段,而其他两个可以。
有人可以给出这些模型之间的区别吗?
答案 0 :(得分:10)
所有这些都是 IModel 接口的实现。
类模型是一个基本实现,几乎只是一个数据持有者'所以你可以在该模型中存储一个对象并获得。如果存储的对象是另一个模型(IModel),则此类的附加值是转发以获取和设置模型对象。
如果要使用属性表达式获取/设置属性,则 ClassModel 类很有用。查看示例:
class Data {
private Integer data;
private String name;
/* getters and setters */
}
如何使用PropertyModel获取和设置数据:
Data data = new Data();
data.setId(1);
data.setName("data entity");
IModel idModel = new PropertyModel(data, "id");
IModel nameModel = new PropertyModel(data, "name");
System.out.println(data.getId());
// prints '1'
System.out.println(idModel.getObject());
// prints '1'
System.out.println(data.getName);
// prints 'data entity'
System.out.println(nameModel.getObject());
// prints 'data entity'
data.setId(2);
nameModel.setObject("a new name");
System.out.println(data.getId());
// prints '2'
System.out.println(idModel.getObject());
// prints '2'
System.out.println(data.getName());
// prints 'a new name'
System.out.println(nameModel.getObject());
// prints 'a new name'
如果要根据ID标识组件的属性,则类
Java代码(MyPanel.java):
class MyPanel extends Panel {
public MyPanel(IModel<Data> model) {
super(new CompoundPropertyModel<Data>(model));
add(new Label("id"));
add(new Label("data"));
}
}
标记(MyPanel.html):
<wicket:panel>
<span wicket:id="id">placeholer for id</span>
<span wicket:id="name">placeholer for id</span>
</wicket:panel>
使用MyClass的Java代码:
// in a Page, Panel or an other Component
Data data = new Data();
data.setId(3);
data.setName('my name');
add(new MyPanel(Model.of(data)));
渲染输出HTML(由面板提供):
<span>3</span>
<span>my name</span>
答案 1 :(得分:1)
请检查https://cwiki.apache.org/confluence/display/WICKET/Working+with+Wicket+models。它给出了非常好的解释 您还可以阅读http://ci.apache.org/projects/wicket/guide/6.x/guide/modelsforms.html
上的官方文档答案 2 :(得分:0)
很好的例子。只需进行一些纠正:
根据
IModel idModel = new PropertyModel(data, "id");
和
private Integer data;
我希望In Data类应该是
private Integer id;
相反。
同样的错误也排在第二位
add(new Label("data"));
期望
add(new Label("name"));
使所有内容正确。谢谢您的帮助。