刪除待辦事項

刪除待辦事項

在每個待辦事項後都有一個刪除按鈕,我們希望按下去可以刪除該項,這時就要用到 command binding 來處理按鈕事件。

Command Binding 就是事件傾聽器 (Event Listener)

這個語法是用來 將元件的事件屬性(如 onClick)綁定到 ViewModel 中的方法 (method),之後在該事件發生時(如按下按鈕),ZK 就呼叫綁定的方法,該方法通常會實作你的應用程式邏輯,如新增、刪除、搜尋等,其實就跟註冊一個事件傾聽器的概念是一樣的。

首先我們必須在 ViewModel 中定義一個方法,並且加上@Command,這樣 ZK 才能辨識出這個 method 是一個 command method,可以被 zul 上的 command binging 呼叫:

public class TodoListViewModel {
    @Command
    public void deleteTodo() {
        System.out.println("deleteTodo");
    }
}

之後就可以在 zul 上綁定該個 command,預設的 command 名稱就是 method 名稱:deleteTodo

    <button onClick="@command('deleteTodo')"
        iconSclass="z-icon-times-circle" style="color:#FFAAAA"/>

這樣一來,你按下按鈕,伺服器就會印出 “deleteTodo”。

不過這樣還無法完成我們要的功能,為了要刪除該列顯示的事項,我們將該 Todo 物件透過 command binding 傳進 command method 中如下:

/tutorial/command/myTodoList.zul

<listcell>
    <button onClick="@command('deleteTodo',todo=each)"
        iconSclass="z-icon-times-circle" style="color:#FFAAAA"/>
</listcell>

command binding 中可以附加一到多個參數,參數之間用逗號分隔,每一個參數的語法是 key=EL-expression, key 是你自訂的名稱,等號後面是 EL 表達式,因此可以傳入任何可以用 EL 存取的物件,在這裡 each 這個保留字代表每一個 Listitem 顯示的 Todo。

在 command method 上我們也要宣告對應的參數,ZK 才能將參數傳入:

@Command
public void deleteTodo(@BindingParam("todo") Todo todo) {
    //刪除後端資料
    todoListService.deleteTodo(todo);
    //刪除畫面上的資料
    todoListModel.remove(todo);
}

@BindingParam("todo") 是用來告訴 ZK,這個參數是要從 command binding 中傳過來,其中 “todo”對應到我們在 command binding 上參數的 key。而這個 method 中就要實作應用程式邏輯,所以我們刪除資料庫中跟刪除元件 data model 中對應的 Todo。

這樣我們就完成了「刪除」的實作。

Comments