ZK:带有列表框的自定义组件未绑定 SelectedItem
ZK: Custom Component with Listbox not binding SelectedItem
我正在创建一个新的自定义组件,但无法将控制器的 属性 绑定到自定义组件的 SelectedItem 注释 属性。我的想法是,任何传递我的自定义组件 SelectedItem 注释的人,我都应该能够在我的组件中检索它并将它自己分配给 ListBox 的 SelectedItem 属性。这将为我的组件的用户提供灵活性,而不必担心内部结构,并且该组件将可重复使用。
问题是我无法 get/set 自定义组件中的 Controller 值。我得到空值。有人可以帮我解决这个问题或指出正确的方向吗?这是代码:
<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}"/>
首先,保持正常注释,如 @load()
、@save()
或 @bind
()`。
现在,我的第一个建议是扔掉你的祖尔。
在您的组件中实现 AfterCompose
接口,并在其中添加带有渲染器的所有项目。
它使任何人都可以更轻松地更改该组件,并且性能会更高。
其次,在 class 中使用正确的注释:
@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>
和最后一样:
您需要通知活页夹所选项目发生了变化:
Events.postEvent("onSelect", FilterDropdown.this, selectedItems);
您应该在附加到 bandbox 的事件侦听器中处理此问题。
如果您需要高级工作组件代码,包括如何将其导出到单独的 jar,请查看 mine github project。
我正在创建一个新的自定义组件,但无法将控制器的 属性 绑定到自定义组件的 SelectedItem 注释 属性。我的想法是,任何传递我的自定义组件 SelectedItem 注释的人,我都应该能够在我的组件中检索它并将它自己分配给 ListBox 的 SelectedItem 属性。这将为我的组件的用户提供灵活性,而不必担心内部结构,并且该组件将可重复使用。
问题是我无法 get/set 自定义组件中的 Controller 值。我得到空值。有人可以帮我解决这个问题或指出正确的方向吗?这是代码:
<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}"/>
首先,保持正常注释,如 @load()
、@save()
或 @bind
()`。
现在,我的第一个建议是扔掉你的祖尔。
在您的组件中实现 AfterCompose
接口,并在其中添加带有渲染器的所有项目。
它使任何人都可以更轻松地更改该组件,并且性能会更高。
其次,在 class 中使用正确的注释:
@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>
和最后一样:
您需要通知活页夹所选项目发生了变化:
Events.postEvent("onSelect", FilterDropdown.this, selectedItems);
您应该在附加到 bandbox 的事件侦听器中处理此问题。
如果您需要高级工作组件代码,包括如何将其导出到单独的 jar,请查看 mine github project。