1

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

这个问题基本上恢复了,我必须apply="myController"在两个.zul中使用吗?如果我这样做,我会在 处得到 nullpointerException myList,因为我认为 zk 正在实例化 2 个控制器对象,并且模态不存在myList。但如果我不在 modal.zul 上应用控制器,当我按下按钮时不会发生任何事情。

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

邮件.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>

modal.zul

<?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>

产品控制器.java

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

@Wire
    private Listbox myList;

//methods...

}
4

1 回答 1

0

不建议这样做

  1. 为了避免并发问题(请参阅此处)例如。如果将相同的控制器实例应用于多个视图,则连接的组件将指向最后一个视图,从而导致 UI 行为不稳定。使用不同的实例而不是针对并发问题进行编码并使控制器线程安全更容易。
  2. 避免内存泄漏。例如。如果将相同的控制器实例应用于两个完全不同的视图,并且两个视图的组件都连接在其中,那么如果其中一个视图没有被使用,则其连接的组件仍然不会被释放,从而导致内存泄漏。
于 2012-06-21T21:03:21.863 回答