Wicket 中的 Model、PropertyModel 和 CompoundPropertyModel 有什么区别?
What is the difference between Model, PropertyModel and CompoundPropertyModel in Wicket?
我已经开始学习 Wicket 框架,并且遇到了 wicket 模型,并且阅读了有关 Model()、CompouneModel() 和 CompoundPropertyModel() 的内容,但我没有了解它们之间的实际区别。我在 Google 上搜索了这个,但没有得到任何相关信息。
link 给出了 CompoundPropertyModel 和 PropertyModel 之间的描述,但仍然不清楚它们之间的区别。
我唯一能区分模型和其他两个的是模型不能使用动态场,而其他两个可以。
谁能告诉我这些型号之间的区别?
它们都是接口IModel.
的实现
Class Model 是一个基本实现,它几乎只是一个 'data holder',因此您可以在该模型中存储一个对象并获取。此class的附加值是如果存储的对象是其他模型(IModel),则转发获取和设置模型对象。
如果您想使用 属性 表达式获取/设置 属性,Class PropertyModel 很有用。看一个例子:
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'
Class CompoundPropertyModel 如果您想通过组件的 ID 将属性传播到组件,那么它很有用。查看示例(使用相同的 class 数据):
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>
Java 代码使用 MyClass:
// 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>
请检查https://cwiki.apache.org/confluence/display/WICKET/Working+with+Wicket+models。它给出了很好的解释。
您还可以在 http://ci.apache.org/projects/wicket/guide/6.x/guide/modelsforms.html
阅读官方文档
很好的例子。只需要一些更正:
根据
IModel idModel = new PropertyModel(data, "id");
和
private Integer data;
我希望 In Data class 应该是
private Integer id;
相反。
下一个同样的错误
add(new Label("data"));
期待
add(new Label("name"));
使一切正确。感谢您的帮助。
我已经开始学习 Wicket 框架,并且遇到了 wicket 模型,并且阅读了有关 Model()、CompouneModel() 和 CompoundPropertyModel() 的内容,但我没有了解它们之间的实际区别。我在 Google 上搜索了这个,但没有得到任何相关信息。
link 给出了 CompoundPropertyModel 和 PropertyModel 之间的描述,但仍然不清楚它们之间的区别。
我唯一能区分模型和其他两个的是模型不能使用动态场,而其他两个可以。
谁能告诉我这些型号之间的区别?
它们都是接口IModel.
的实现Class Model 是一个基本实现,它几乎只是一个 'data holder',因此您可以在该模型中存储一个对象并获取。此class的附加值是如果存储的对象是其他模型(IModel),则转发获取和设置模型对象。
如果您想使用 属性 表达式获取/设置 属性,Class PropertyModel 很有用。看一个例子:
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'
Class CompoundPropertyModel 如果您想通过组件的 ID 将属性传播到组件,那么它很有用。查看示例(使用相同的 class 数据):
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>
Java 代码使用 MyClass:
// 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>
请检查https://cwiki.apache.org/confluence/display/WICKET/Working+with+Wicket+models。它给出了很好的解释。
您还可以在 http://ci.apache.org/projects/wicket/guide/6.x/guide/modelsforms.html
很好的例子。只需要一些更正:
根据
IModel idModel = new PropertyModel(data, "id");
和
private Integer data;
我希望 In Data class 应该是
private Integer id;
相反。
下一个同样的错误
add(new Label("data"));
期待
add(new Label("name"));
使一切正确。感谢您的帮助。