在檢票應用程序/改變風格,我有一堆<button>
元素到我攻擊一個Link
組件。現在在組件的onClick()
方法中,我想禁用或更改按鈕的樣式。我怎樣才能做到這一點?調用setEnabled(false)
不起作用。如何禁用的onClick()檢票按鈕鏈接
回答
的onClick(的)重複使用正在操作在存儲器中的同一對象上。如果你沒有使用Ajax,你仍然可以在Link的匿名子類中保留一些狀態。然後,您可以使用onBeforeRender()和onComponentTag()更改每次顯示的方式。
Link<Void> link = new Link<Void>("myLink") {
private String customCSS = null;
private boolean customEnabled = true;
public void onClick() {
if (/* test to determine disabled */) {
customCSS = "disabled";
customEnabled = false;
} else {
customCSS = null;
customEnabled = true;
}
}
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
if (customCSS != null)
tag.put("class", customCSS);
}
@Override
public boolean isEnabled() {
return super.isEnabled() && customEnabled;
}
};
AttributeModifiers(或其他行爲)不利於這種情況下,因爲,如果你在onclick()方法中添加他們,他們就會開始堆積在同一條鏈路的每個點擊 - 因爲它們都作爲鏈路狀態的一部分。
您的鏈接可以保持狀態的所有方式的軌道,讓你的onClick()方法來實現與重複點擊/禁用/變更/等。
您還可以覆蓋onBeforeRender(),可見性(),而每個鏈接顯示在頁面上同時運行其他方法。無論您單擊按鈕多少次,構造函數onConfigure()和其他構造函數都只運行一次。
我覺得AjaxCallDecorator應該是你需要使用禁用按鈕/改變風格類。
我沒有使用Ajax – 2011-05-07 19:11:08
看看SimpleAttributeModifier和AttributeAppender。根據你的實際要求,其中一個應該做的伎倆。 SimpleAttributeModifier添加或替換在wicket中具有prepresentation的任何HTML-Tag的屬性(替換css類),而AttributeAppender附加到屬性(添加另一個CSS類)。這應該用於啓用/禁用按鈕,但我沒有嘗試過。
例子:
Label label = new Label("id", "Some silly text.")
add(label);
label.add(new SimpleAttributeModifier("class", "my-css-class");
對於Ajax,你必須將組件添加到目標也是如此。
更詳細的例子:
Java代碼:
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.Model;
public class DemoPage extends WebPage {
public DemoPage() {
Form form = new Form("form");
add(form);
final WebMarkupContainer wmc = new WebMarkupContainer("greenText");
form.add(wmc);
form.add(new Link("redLink"){
@Override
public void onClick() {
wmc.add(new SimpleAttributeModifier("class", "redText"));
}});
final Button boldButton = new Button("boldButton"){
@Override
public void onSubmit() {
wmc.add(new AttributeAppender("class", true, new Model<String>("boldText"), " "));
}};
form.add(boldButton);
Link disabler = new Link("buttonDisabler") {
@Override
public void onClick() {
boldButton.add(new AttributeAppender("disabled", true, new Model<String>("disabled"), " "));
}
};
form.add(disabler);
}
}
相應的HTML:
<html>
<head>
<style>
.redText {
color: red;
}
.greenText {
color: green;
}
.boldText {
font-weight: bold;
}
</style>
</head>
<body>
<form wicket:id="form">
<div class="greenText" wicket:id="greenText">This is Green.</div><br />
<a href="" wicket:id="redLink">Make it red</a><br />
<input type="submit" wicket:id="boldButton" value="Make it bold" /><br />
<a href="" wicket:id="buttonDisabler">Disable the button</a>
</form>
</body>
</html>
在鏈接的onClick()方法內動態添加時,SimpleAttributeModifier似乎不起作用。我也嘗試在構建過程中添加一個AttributeModifier,但它根本沒有效果。 – 2011-05-07 19:30:18
@Michael Borgwardt適合我...我添加了一個工作示例,讓你走... – Nicktar 2011-05-08 10:19:02
的問題是,您使用的鏈接。已禁用的鏈接使用<span>
而不是<a>/<button>
,默認情況下使用<em>
。 使用Button組件將在元素中設置'disabled'屬性。
我將鏈接代碼更改爲Button,但setEnabled(false)仍然沒有任何效果。 – 2011-05-07 19:12:34
我不認爲這是在Wicket完全好主意。當然,它可以通過弄虛作假來完成,但它的簡單得多之一:
- 覆蓋的
isEnabled()
方法返回從表單/組件的模型得出的值。 - 創建組件時附加
AttributeModifier
,並使用返回上述派生值的模型。
無論您選擇哪一種,原則是讓Wicket「拉」渲染信息而不是明確推送它。
Michael Borgwardt提供的答案基本正確。
問題是你使用鏈接。已禁用的鏈接使用
<span>
而不是<a>/<button>
,默認情況下使用<em>
。使用按鈕 組件將在元素中設置'禁用'屬性。
我想補充一點,您需要使用HTML按鈕元素而不是<a>
(鏈接)。最初的回答可以是反饋,因爲Wicket中也存在鏈接和按鈕。
- 1. 在檢票口啓用/禁用按鈕
- 2. 如何完全禁用鏈接按鈕?
- 3. 禁用按鈕OnClick
- 4. 如何禁用Reactjs中的按鈕onclick?
- 5. 禁用我的onclick按鈕
- 6. 禁用鏈接的onclick
- 7. 如何在用戶投票後禁用(相應)投票按鈕?
- 8. 禁用jquery中的鏈接按鈕
- 9. 禁用菜單中的鏈接按鈕
- 10. 鏈接按鈕沒有被禁用了,如何在網格視圖中禁用鏈接按鈕?
- 11. 捲曲鏈接的onclick按鈕
- 12. 劍道電網的onclick按鈕,鏈接
- 13. 如何使用單選按鈕的onclick事件更改鏈接的onclick事件?
- 14. 如何打開鏈接按鈕文檔onClick按
- 15. HTML按鈕onclick鏈接不工作
- 16. 需要onclick按鈕不是熱鏈接
- 17. 如何使用jQuery禁用/啓用按鈕/鏈接?
- 18. 如何禁用網格視圖中的鏈接按鈕
- 19. 如何禁用Datalist中的鏈接按鈕?
- 20. 如何禁用jQuery Mobile中的鏈接按鈕?
- 21. 如何在點擊時禁用gridview中的鏈接按鈕
- 22. 檢票收藏的鏈接
- 23. 如何讓鏈接執行按鈕的onclick代碼?
- 24. 禁用鏈接/按鈕,直到單擊另一個按鈕
- 25. 如何禁用客戶端點擊鏈接按鈕或圖像按鈕
- 26. 如何在單擊後禁用鏈接按鈕(無JQuery)
- 27. 如何在devexpress gridview中禁用超鏈接按鈕
- 28. 如何鏈接按鈕?
- 29. 如何通過數據鏈接按鈕onclick事件
- 30. 如何鏈接外部JavaScript文件onclick按鈕
謝謝 - 覆蓋isEnabled()訣竅 – 2011-05-08 12:55:14
正如在JavaDoc中所述,重寫isEnabled和isVisible應謹慎使用 - 儘管我一直都在使用它。只要確保操作成本非常低廉。 – jbrookover 2011-05-08 13:31:19
即使在wicket wiki中提到該解決方案,如果wicket支持類似於開箱即用的東西,是不是像重新發明輪子那樣? – Nicktar 2011-05-09 07:53:03