私はWicketを使い始めたばかりで、「Wicket in action-by Martijn Dashorst and Eelco Hillenius」という本を読みながら、学んだことのいくつかを小さなテストに実装しようとしていますが、使用しようとすると間違いを犯しているようです。フォーム内のAjaxFallbackButton。コードはWicketTesterテストを通過しますが、実行すると、完全には理解できないエラーが発生します。
私が達成しようとしているのは、ユーザーが式を入力してボタンをクリックすると、式が評価されてフォームの下に表示される単純なフォームを表示するページです。今のところ、フォームの内容をラベル付きで表示することに固執します。この本にはこのような例がありますが、ページ全体ではなくラベルだけを更新できるAjaxFallBackButtonを使用していません。
これはhtmlテンプレートです:
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<head>
<meta charset="utf-8" />
<title>Wicket test</title>
<link href='http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz:regular,bold' rel='stylesheet' type='text/css' />
<link rel="stylesheet" href="style.css" type="text/css" media="screen" title="Stylesheet" />
</head>
<body>
<div id="header">
<div id="logo">
<h1>Wicket test</h1>
</div>
</div>
<div id="body">
<h2>Simple test for wicket learning purposes</h2>
<p>
Test: <wicket:container wicket:id="message">text here</wicket:container>
</p>
<form wicket:id="form">
<input wicket:id="textField" type="text" />
<input wicket:id="evalButton" type="submit" value="evaluate" />
</form>
<p>
Result: <span wicket:id="evalResultLabel">result</wicket:container>
</p>
</div>
<div id="footer">
</div>
</body>
</html>
これは対応するJavaコードです。
public class HomePage extends WebPage {
private Label evalResultLabel;
private TextField<String> textField;
public HomePage() {
add(new Label("message", "lalala"));
Form<?> form = new Form("form");
textField = new TextField<String>("textField", new Model<String>("type expression here"));
form.add(textField);
form.add(new AjaxFallbackButton("evalButton", form) {
@Override
public void onSubmit(AjaxRequestTarget target, Form<?> form) {
String expr = textField.getModelObject();
evalResultLabel.setDefaultModelObject(expr);
if (target != null) {
target.add(evalResultLabel);
}
}
});
evalResultLabel = new Label("evalResultLabel", new Model<String>(""));
evalResultLabel.setOutputMarkupId(true);
add(form);
add(evalResultLabel);
}
}
エラーメッセージは次のとおりです。
予期しないRuntimeException-最後の原因:[ページクラス= HomePage、id = 0、レンダリングカウント= 1]でID'form'のコンポーネントが見つかりません。予期される:'。form'。類似の名前で見つかりました:''
マークアップ行:
<form wicket:id="form">
WicketTesterテストを実行するとわかります。
警告-コンポーネント-通常はマークアップにレンダリングされないコンポーネントに設定されたマークアップID。マークアップID:evalResultLabel3、コンポーネントID:evalResultLabel、コンポーネントタグ:コンテナ。
誰かが私が間違っていることを教えてもらえますか?私はこの本でこれについてさらに学ぶかもしれないことを知っています、しかしそれはちょっとこのテストの目的を打ち負かします。
更新:通常の改札ボタンを使用した場合にも同じ問題が発生します:
public class HomePage extends WebPage {
private Label evalResultLabel;
private TextField<String> textField;
public HomePage() {
add(new Label("message", "lalala"));
Form form = new Form("form");
textField = new TextField<String>("textField", new Model<String>("type expression here"));
form.add(textField);
form.add(new Button("evalButton") {
@Override
public void onSubmit() {
String expr = textField.getModelObject();
evalResultLabel.setDefaultModelObject(expr);
}
});
evalResultLabel = new Label("evalResultLabel", new Model<String>(""));
add(form);
add(evalResultLabel);
}
}
これは、本に記載されている例とほぼ同じです。何が間違っているのかわかりません。この本はかなり古いですが、Wicket 1.2または1.3を使用していると思いますが、その間に何かが変わったのではないでしょうか。この小さなコードを修正する方法はありますか?