2014-01-09 115 views
1

我對ZK框架非常陌生,試圖自定義一些東西,並且碰到了一個我不確定如何實現的事情。在按鈕上獲取選定的ListBox值單擊| ZK

我有一個預定義的部分,在那裏我需要顯示2下拉和一個按鈕,需要堅持的下拉按鈕點擊事件值。 這就是它一直在Spring中定義文件

<bean id="mybean" parent="parentBean" class="WidgetRenderer"> 
    <property name="detailRenderer"> 
      <bean class="DetailsListRenderer" parent="abstractWidgetDetailRenderer"/> 
    </property> 
</bean> 

這裏mybean被用來顯示主要部分,我將我的下拉按鈕時被添加到detailRenderer使用這個bean。

保存按鈕被綁定到onClick事件,但我不知道我怎麼可以獲取從我的自定義值下拉? 我知道綁定那些DropdownonClick事件,但他們必須在同一類。

任何一個可以建議我如何用我下面的代碼

Listbox listbox = new Listbox(); 
listbox.appendItem("item1", "item1"); 
listbox.appendItem("item2", "item2"); 

創建down下來取那些降就弄傷的值這是在另一個類中我的按鈕代碼

protected void createUpdateStatusButton(Widget widget,Div container) 
{ 
    Button button = new Button(LabelUtils.getLabel(widget, buttonLabelName, new Object[0])); 
    button.setParent(container); 
    button.addEventListener("onClick", new EventListener() 
    { 
     public void onEvent(Event event)throws Exception 
     { 
      MyClass.this.handleSaveStatusEvent(widget, event); 
      } 
    }); 
    } 

回答

2

你可能想要聽取onSelect(我傾向於使用Events.ON_SELECT而不是寫入字符串),該選項更適合於Listbox選擇更改時的特定情況。

無論哪種方式,關鍵是要從Event傳遞到EventListener而不是回到Listbox本身。基本Event通常攜帶有用信息getTargetgetData,但使用更具體的事件(SelectEvent在這種情況下)將讓您訪問更多的相關信息。

button.addEventListener(Events.ON_SELECT, new EventListener<SelectEvent<Listitem, MyDataObject>() { 
    public void onEvent(SelectEvent<Listitem, MyDataObject> event) { 
     // Now you can access the details of the selection event.. 
     List<Listitem> selectedItems = event.getSelectedItems(); 
     List<MyDataObject> selectedObjects = event.getSelectedObjects(); 
    } 
}); 

你可以在Component Reference documentation中找到不同的ZK小部件可用的事件。

+0

感謝input..since我是很新的ZK,'Events.ON_SELECT'會當我在ListBox中選擇任何東西時觸發,但是當我點擊按鈕時我需要它。如果我要求一些背景問題,總是需要它。總之,當我點擊'Save'按鈕時,我想獲取兩個'ListBox'的值。 –

+0

爲什麼不創建zul頁面而不是通過代碼創建它? – chillworld

+0

@chillworld:我還沒有完全自由地這樣做,必須遵循現有的代碼模式,其中沒有zul文件,只有Java代碼 –

1

如果我理解了這個問題(我認爲我沒有在我之前的回覆中做過),您希望在用戶單擊按鈕時從頁面收集信息(例如:Listbox選擇狀態)。您的問題在於您使用不同的課程組成頁面,因此無法訪問點擊該按鈕時的各種ZK Component

(忽略多分類問題一分鐘)
從較高的層面來看,ZK社區有兩種陣營。較新的MVVM方法建議視圖應該在用戶與前端進行交互時將相關狀態推向後端。這樣,後端永遠不需要詢問客戶端狀態,並且當單擊該按鈕時,值/狀態在服務器上準備好使用。

另一個陣營將客戶端綁定到服務器,以便後端始終可以訪問客戶端Component,並且單擊該按鈕時,可以通過與組件交互輕鬆地檢索值/狀態。

另一種方法更像是我在我以前的答案議論紛紛,不後端到客戶端的所有,但依靠儘可能多的事件數據綁定。我認爲這種方法足夠。

現在,你可以自由選擇你喜歡的方法,ZK有很多關於如何在這兩個陣營中工作的文檔。接下來的問題是客戶端狀態在服務器上存儲在哪裏(或者由MVVM中的客戶端推送到那裏,或者在MVC中綁定到那裏)。我認爲這不是一個可以在這裏解決的問題,這是一個軟件工程挑戰。我個人建議你採用標準的ZK模式,以免與框架一起出現。如果你真的想要去的路線,你可以在飛行中抓住的Listbox的參考,像這樣:

public class Foo { 

    public static final String LISTBOX_ID = "myListbox"; 

    public void renderListbox(Component parent, MyItem items) { 
     Listbox listbox = new Listbox(); 
     listbox.setId(LISTBOX_ID); 
     listbox.setParent(parent); 
     for (MyItem item : items) { 
      listbox.appendItem(item.getName(), item); 
     } 
    } 

} 

public class Bar { 

    @Listen(Events.ON_CLICK + " = #saveButton") 
    public void saveButtonClicked(Event event) { 
     Component saveButton = event.getTarget(); 
     Listbox listbox = (Listbox) saveButton.getFellow(Foo.LISTBOX_ID); 
     Set<Listitem> selection = listbox.getSelectedItems(); 
     // do something 
} 
+0

有沒有什麼辦法可以在不向組件提供ID的情況下獲得這些值?問題是在同一頁面上的另一個按鈕,這是刷新頁面,我收到了唯一的ID異常,我不能刪除該按鈕,它需要在那裏 –

+0

如果'組件'定義在ZUL(不是你的情況),你可以綁定他們在控制器[使用CSS選擇器](http://books.zkoss.org/wiki/Small_Talks/2011/January/Envisage_ZK_6:_An_Annotation_Based_Composer_For_MVC#Comparison_with_CSS3_Selector),或者只是讓他們的數據綁定到服務器,所以你不需要完全可以引用組件。如果你用Java創建組件,我想不出一種方法可以從Java中檢索它們,除了保留「Object」引用。 –