如果我有2个.zul,则一个有一个列表框,另一个是模态窗口。他们可以使用同一控制器吗?我就是无法正常工作。

问题基本上会在以下位置恢复,我是否必须在两个.zul中都使用apply="myController"
如果这样做,我会在myList处得到nullpointerException,因为我认为zk实例化了2个控制器对象,而模态myList不存在。但是如果我不在modal.zul上应用控制器,那么当我按下按钮时什么也不会发生。

如何使2 .zul使用相同的控制器实例?

mail.zul

<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" ?>
<zk>
    <hlayout>
    <div id="winDiv" apply="com.company.controller.ProductController">
        <vbox>
            <listbox id="myList" width="690px" height="300px" >
                <listhead>
                    <listheader hflex="min" label="id" sort="auto(id)" />
                    <listheader hflex="2" label="name" sort="auto(name)" />
                    <listheader hflex="4" label="description" sort="auto(description)" />
                                        <listheader hflex="min" label="opcion"/>
                                </listhead>
            </listbox>
        </vbox>
    </div>
            <button label="new" id="new"/>
        </hlayout>
</zk>


模态

<?xml version="1.0" encoding="UTF-8"?>
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
<window id="modalProductType" title="Nuevo tipo de producto" border="normal" width="420px"
    closable="true" position="center,center" **apply="com.company.controller.ProductController"**>

    <grid>
        <columns>
                <column hflex="1"/>
                <column hflex="2"/>
        </columns>
        <rows>
                <row>
                    Clave:
                     <textbox hflex="1" value="@{product.id}" readonly="true"/>
                </row>
                <row>
                    Nombre:
                     <textbox id="txtname" value="@{product.name}" hflex="1" tabindex="1" />
                </row>
                <row>
                     Description:
                      <textbox value="@{product.description}" rows="5" hflex="1" tabindex="2" />
                </row>
                <row>
                    <cell colspan="2" style="text-align:center">
                        <hlayout>
                            <button width="100px" id="save" label="Aceptar"/>
                            <button width="100px" label="close"/>
                        </hlayout>
                   </cell>
                </row>
        </rows>
    </grid>
</window>


ProductController.java

public class ProductTypeController extends SelectorComposer {
@WiredVariable
    private ProductTypeService productTypeService;

@Wire
    private Listbox myList;

//methods...

}

最佳答案

不建议这样做


为了避免并发问题(请参阅here)。如果将同一控制器实例应用于多个视图,则有线组件将指向最后一个视图,从而导致UI行为不稳定。仅使用不同的实例而不是为并发问题进行编码并使控制器线程安全更容易。
为了避免内存泄漏。例如。如果将相同的控制器实例应用于两个完全不同的视图,并且两个视图中的组件都已连接到其中,则如果未使用其中一个视图,则其连接的组件仍不会释放,从而导致内存泄漏。

10-06 15:58