【问题标题】:ZK: Custom Component with Listbox not binding SelectedItemZK:带有列表框的自定义组件未绑定 SelectedItem
【发布时间】:2018-03-11 00:10:52
【问题描述】:

我正在创建一个新的自定义组件,但无法将控制器的属性绑定到我的自定义组件的 SelectedItem 注释属性。我的想法是,任何通过我的自定义组件 SelectedItem 注释的人,我都应该能够在我的组件中检索它并将它自己分配给 ListBox 的 SelectedItem 属性。这将为我的组件的用户提供灵活性,无需担心内部结构,并且该组件将可重用。

问题是我无法在我的自定义组件中获取/设置控制器值。我得到NULL。有人可以帮我解决这个问题或指出正确的方向吗?代码如下:

<bandbox id="filterDropdownBandBox" instant="true" readonly="false">
<bandpopup id="filterDropdownBandPopup" style="max-height:250px;overflow-x:hidden">
    <listbox id="listBox" hflex="1" rows="0" >
         <template name="model">
             <listitem>
                 <listcell label="${each.label}" />
             </listitem>
         </template>
     </listbox>
</bandpopup>

public class FilterDropdown extends Div implements IdSpace {

@Wire
private Listbox listBox;
@Wire
private Bandpopup filterDropdownBandPopup;
@Wire
private Bandbox filterDropdownBandBox;

private ListModelList<GenericNameValuePair> lbModel;

public FilterDropdown() {
    Executions.createComponents("/filterDropdown.zul", this, null);
    Selectors.wireComponents(this, this, false);
    Selectors.wireEventListeners(this, this);
}
public void setSelectedItem(Listitem l) // getting NULL here
    {
        l.setParent(listBox);
        listBox.setSelectedItem(l);
    }
 public void saveSelection() {
     listBox.getSelectedItem();
 }

 public Listitem getSelectedItem() {
     return listBox.getSelectedItem();
 }
}

这就是我将此组件添加到 lang-addon.xml 文件的方式

<component>
    <component-name>filter-dropdown</component-name>
    <extends>div</extends>
    <component-class>com.components.FilterDropdown</component-class>
    <annotation>
        <annotation-name>DDBIND</annotation-name>
        <property-name>selectedItem</property-name>
        <attribute>
            <attribute-name>ACCESS</attribute-name>
            <attribute-value>both</attribute-value>
        </attribute>
    </annotation>
</component>

这就是我在其他 ZUL 文件中使用自定义组件的方式

 <filter-dropdown id="filterProjDropdown" selectedItem="@DDBIND{XYZCtrl.bean.propbean.actualProp}"/>

【问题讨论】:

    标签: binding listbox annotations custom-controls zk


    【解决方案1】:

    首先,保持普通注解,如@load()@save()@bind()`。

    现在,我的第一个建议是扔掉你的 zul。
    在您的组件中实现AfterCompose 接口并使用渲染器添加所有项目。
    它使任何人都可以更轻松地更改该组件,并且性能会更高。

    其次,在课堂上使用正确的注释:

    @ComponentAnnotation({"selectedItem:@ZKBIND(ACCESS=both,SAVE_EVENT=onSelect)"}) 
    

    像这样你的 lang-addon.xml 应该是这样的:

    <component> 
         <component-name>filter-dropdown</component-name> 
         <extends>div</extends> 
         <component-class>com.components.FilterDropdown</component-class> 
    </component> 
    

    最后:

    您需要通知活页夹 selectedItems 发生了变化:

    Events.postEvent("onSelect", FilterDropdown.this, selectedItems);
    

    您应该在连接到 bandbox 的事件监听器中处理此问题。

    如果您想要一个高级的工作组件代码,包括如何将其导出到单独的 jar,请查看mine github project

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 2015-07-23
      • 2014-01-05
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多