从 Wicket 中外部 class 中的内部 onClick 方法访问变量
Access variable from inner onClick method in outer class in Wicket
我有一个 class 看起来像这样
private static class LinkTest extends WebMarkupContainer {
public LinkTest(String id) {
super(id);
AjaxLink<Object> link = new AjaxLink<>("link") {
@Override
public void onClick(AjaxRequestTarget target) {
String content = //... some function call
}
};
add(link);
// .. how to access "content" variable here
link.add(new Label("label", Model.of(content)));
add(new AttributeAppender("onclick",
new Model(format("alert('%s');", contentModel)), ";"));
}
}
我想访问 LinkTest 构造函数中的“内容”变量。有什么想法吗?
匿名 class 可以访问其封闭 class 的成员。所以你可以这样做
private static class LinkTest extends WebMarkupContainer {
//Here!
String content;
public LinkTest(String id) {
super(id);
AjaxLink<Object> link = new AjaxLink<>("link") {
@Override
public void onClick(AjaxRequestTarget target) {
content = //... some function call
}
};
add(link);
// .. how to access "content" variable here
link.add(new Label("label", Model.of(content)));
}
}
通过在两个组件之间共享模型来轻松解决。
private static class LinkTest extends WebMarkupContainer {
public LinkTest(String id) {
super(id);
IModel<String> contentModel = ()-> /* some function call */;
AjaxLink<String> link = new AjaxLink<>("link", contentModel) {
@Override
public void onClick(AjaxRequestTarget target) {
target.add(this);
target.appendJavaScript("alert('"+getModelObject()+"');");
}
};
add(link);
// .. how to access "content" variable here
link.add(new Label("label", contentModel));
}
}
private static class LinkTest extends WebMarkupContainer {
public LinkTest(String id) {
super(id);
// 1
IModel<String> contentModel = Model.of("initial value");
AjaxLink<String> link = new AjaxLink<>("link", contentModel) {
@Override
public void onClick(AjaxRequestTarget target) {
// 2
contentModel.setObject("a new value");
// 3
target.add(this.get("label"));
// 5
target.appendJavaScript("alert('"+contentModel.getObject()+"');");
}
};
add(link);
Label label = new Label("label", contentModel);
link.add(label);
//4
label.setOutputMarkupId(true);
}
}
- 想法是为
content
使用可共享的容器。在 Wicket 中,这是模型 (IModel
)。
- 单击 link 后,您将更新模型
- 要更新标签,您需要将其添加到 AjaxRequestTarget。
- 不要忘记通过调用
.setOutputMarkupId(true)
使标签 Ajax 可更新
- 通过使用
target.appendJavaScript(CharSequence)
您可以将新计算的content
发送到浏览器
我有一个 class 看起来像这样
private static class LinkTest extends WebMarkupContainer {
public LinkTest(String id) {
super(id);
AjaxLink<Object> link = new AjaxLink<>("link") {
@Override
public void onClick(AjaxRequestTarget target) {
String content = //... some function call
}
};
add(link);
// .. how to access "content" variable here
link.add(new Label("label", Model.of(content)));
add(new AttributeAppender("onclick",
new Model(format("alert('%s');", contentModel)), ";"));
}
}
我想访问 LinkTest 构造函数中的“内容”变量。有什么想法吗?
匿名 class 可以访问其封闭 class 的成员。所以你可以这样做
private static class LinkTest extends WebMarkupContainer {
//Here!
String content;
public LinkTest(String id) {
super(id);
AjaxLink<Object> link = new AjaxLink<>("link") {
@Override
public void onClick(AjaxRequestTarget target) {
content = //... some function call
}
};
add(link);
// .. how to access "content" variable here
link.add(new Label("label", Model.of(content)));
}
}
通过在两个组件之间共享模型来轻松解决。
private static class LinkTest extends WebMarkupContainer {
public LinkTest(String id) {
super(id);
IModel<String> contentModel = ()-> /* some function call */;
AjaxLink<String> link = new AjaxLink<>("link", contentModel) {
@Override
public void onClick(AjaxRequestTarget target) {
target.add(this);
target.appendJavaScript("alert('"+getModelObject()+"');");
}
};
add(link);
// .. how to access "content" variable here
link.add(new Label("label", contentModel));
}
}
private static class LinkTest extends WebMarkupContainer {
public LinkTest(String id) {
super(id);
// 1
IModel<String> contentModel = Model.of("initial value");
AjaxLink<String> link = new AjaxLink<>("link", contentModel) {
@Override
public void onClick(AjaxRequestTarget target) {
// 2
contentModel.setObject("a new value");
// 3
target.add(this.get("label"));
// 5
target.appendJavaScript("alert('"+contentModel.getObject()+"');");
}
};
add(link);
Label label = new Label("label", contentModel);
link.add(label);
//4
label.setOutputMarkupId(true);
}
}
- 想法是为
content
使用可共享的容器。在 Wicket 中,这是模型 (IModel
)。 - 单击 link 后,您将更新模型
- 要更新标签,您需要将其添加到 AjaxRequestTarget。
- 不要忘记通过调用
.setOutputMarkupId(true)
使标签 Ajax 可更新 - 通过使用
target.appendJavaScript(CharSequence)
您可以将新计算的content
发送到浏览器