我正在为大学开发一个Wicket应用程序,但我遇到了(一个有点棘手的)问题。
要设置一些上下文:我正在创建一个使用HTML5播放器的应用程序,我的解决方案是为包含播放器的页面的构造函数提供一些PageParamameters
来进行查询并检索源代码为了媒体。
现在我的问题是我正在使用模板,所以我创建了一个自动放置页眉和页脚的页面,但我的播放器需要PageParameters
才能正常工作而我正努力它可以从BasePage
扩展,但是基页的构造函数也有一些参数,因此它可以根据它当前所在的页面动态更改标题上的文本。这使得super()
方法变得棘手:
protected BasePage(String tabHeader, String header) {
add(new Label("tab_title", tabHeader));
add(new Header("header", header));
add(new UserPanel("user_panel"));
add(new Footer("footer"));
}
我的播放器页面:
public PlayerPage(PageParameters params) {
String name = params.get("name").toString();
MediaItem item = getItem(name.trim());
add(new Label("tab_title", "MaeGûl - " + name)); //trying to get rid of this
add(new Header("header", item.getName())); //and this
add(new UserPanel("user_panel")); //and this
if (item.getType().equals(ItemTypes.MUSIC)) {
add(new AudioPlayer("player", item.getMediaSources()));
} else if (item.getType().equals(ItemTypes.SERIES)
|| item.getType().equals(ItemTypes.MOVIES))
add(new VideoPlayer("player", item.getMediaSources()));
add(new Footer("footer")); //and this
}
正如您所看到的,如果我将super(tabHeader, header)
放在我的PlayerPage
构造函数中,则需要使用“name”参数来更新BasePage
的标题和tabHeader,所以我是stupmed ...
对此有何解决方案?
答案 0 :(得分:2)
您可以将BasePage
更改为接受模型而不是字符串:
protected BasePage(IModel<String> tabHeader, IModel<String> header)
并将值的检索委托给专用模型,例如源自AbstractReadOnlyModel
:
public PlayerPage(PageParameters params) {
super(new TabHeaderModel(params), new HeaderModel(params));
...
}
答案 1 :(得分:0)
当然,任何组件都可以使用一种方法来获取PageParameters
。它是......
getPage().getPageParameters();
但是,要让getPageParameters()
返回非空值,您必须使用Page
调用Wicket super(params)
构造函数,因此坚持要求BasePage
有一个构造函数BasePage(PageParameters params)
。
事实上,在玩了一段时间之后,如果您对大多数网页使用BookmarkablePageLink
和PageParameters
,那么任何扩展Page
的内容都应该只实现构造函数{{1 }}。如果您使用会话相关页面和大量Page(PageParameters params)
类型的代码,则不适用。