1

2つの.zulがある場合、1つにはリストボックスがあり、もう1つはモーダルウィンドウです。同じコントローラーを使用できますか?私はそれを機能させることができません。

質問は基本的に再開しますapply="myController"が、両方の.zulで使用する必要がありますか?これを行うと、zkmyListが2つのコントローラーオブジェクトをインスタンス化しており、モーダルが存在しないため、でnullpointerExceptionが発生します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>

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>

ProductController.java

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

@Wire
    private Listbox myList;

//methods...

}
4

1 に答える 1

0

これはお勧めしません

  1. 同時実行の問題を回避するには(ここを参照)。同じコントローラーインスタンスが複数のビューに適用されると、ワイヤードコンポーネントは最後のビューを指し、UIの動作が不安定になります。同時実行の問題をコーディングしてコントローラースレッドを安全にする代わりに、異なるインスタンスを使用する方が簡単です。
  2. メモリリークを回避するため。たとえば。同じコントローラーインスタンスが2つの完全に異なるビューに適用され、両方のビューのコンポーネントが配線されている場合、ビューの1つが使用されていない場合でも、配線されているコンポーネントは解放されず、メモリリークが発生します。
于 2012-06-21T21:03:21.863 に答える