Я хочу использовать событие onSelect дерева ZK, которое отображается через MVVM.

Вот файл zul для справки

<?page title="MVVM Tree POC"?>
<zk>
    <borderlayout height="800px">
        <west size="25%"></west>
        <center>
            <window apply="org.zkoss.bind.BindComposer"
                viewModel="@id('vm') @init('com.nagarro.viewmodel.TreeViewModel')"
                title="Dynamic Tree" border="normal">
                <tree checkmark="true" model="@bind(vm.treeModel)"
                    onSelect="@command('select')" >
                    <template name="model" var="node" status="s">
                        <treeitem checkable="@load(node.checkable)"
                            open="true">
                            <treerow style="text-align:center;">
                                <treecell
                                    label="@bind(node.data.firstName)" style="text-align:left;">
                                </treecell>
                            </treerow>
                        </treeitem>
                    </template>
                </tree>

            </window>
        </center>
    </borderlayout>
</zk>

В теге дерева есть событие onSelect, и только для некоторых элементов дерева есть флажки. Теперь я хочу создать определенные компоненты, такие как поле со списком, для соответствующей строки дерева, когда ее флажок установлен. Я пытаюсь сделать это с помощью события onSelect дерева, но проблема в том, что мне нужно передать ссылка на выбранный флажок, который я не могу передать, поскольку событие onSelect остается за рамками шаблона, через который отображаются элементы дерева. Есть ли другой способ сделать то, что я хочу

Это страница, которую я получаю через вышеуказанный файл zul.

Я хочу знать, какой флажок установлен?


person Jatin Sehgal    schedule 31.01.2013    source источник


Ответы (2)


Вы можете передать любой параметр для каждого такого события (из документов ZK):

<button label="Delete" onClick="@command('delete', item=item)"/>

и используйте этот параметр в своем java-коде:

@Command
public void delete(@BindingParam("item") Item item ) {
    //do some stuff based on what item you've picked
}

В вашем случае я бы переместил onSelect-Event из Tree-Component в Treeitem, например:

<tree checkmark="true" model="@bind(vm.treeModel)">
                        <template name="model" var="node" status="s">
                            <treeitem checkable="@load(node.checkable)"
                                open="true" onSelect="@command('select', nameParameter=node.data.firstName">
                                <treerow style="text-align:center;">
                                    <treecell
                                        label="@bind(node.data.firstName)" style="text-align:left;">
                                    </treecell>
                                </treerow>
                            </treeitem>
                        </template>
                    </tree>

и используйте параметр в вашем методе @Command:

@Command
public void select(@BindingParam("nameParameter") String nameParameter ) {
    System.out.println(nameParameter + " selected");
}

См. ZK MVVM > Advance > Parameter Docs. Дополнительная информация

person am29d    schedule 13.02.2013
comment
Я завершил это, добавив событие onSelect в компонент treeRow. Спасибо, в любом случае. - person Jatin Sehgal; 13.02.2013

Это проблема, с которой я часто сталкиваюсь. Мое решение всегда заключалось в том, чтобы прикреплять данные к самому компоненту; сохранить идентификатор объекта базы данных или сам объект на флажке для поиска во время события.

checkbox.setAttribute("myAttributeName", myAttributeValue);

Это требует приведения для извлечения, что досадно, но с некоторыми передовыми методами вы можете сделать это уверенно.

person Sean Connolly    schedule 31.01.2013