我在Zend表单上一起使用dojo FilteringSelect元素,但我不能让它按照我想要的方式工作。我的商店有三个字段id
,label
,name
。标签将用于下拉菜单,也用于搜索,而name
应用于框内的显示。问题是我无法找到使这种行为发挥作用的方法。
将labelAttr
值设置为label
会在下拉列表中显示,但searchAttr
属性会在选择值后控制输入框中的搜索和显示。我需要搜索label
字段,因为它是许多字段的集合,但在name
上显示值,是否可能?
编辑:@RichardAyotte Dijit FilteringSelect小部件使用dojo.data.store,它基本上是一个javascript对象,其中每个项目也是一个具有许多参数的对象。您可以在商店中设置两个特殊参数: labelAttr 和 searchAttr ,这将定义一些行为。 FilteringSelect绑定到您可以搜索的INPUT框。如果您点击该框,则会打开选项列表,例如 。在这里它显示你定义为labelAttr的任何东西。现在,如果您在框中键入内容,它将使用 searchAttr 字段中定义的内容搜索商店。一旦您从列表中选择了某些内容,它也会使用标签的值显示在输入内部(您可以在此处查看http://dojotoolkit.org/reference-guide/1.9/dijit/form/FilteringSelect.html#displaying-rich-text-menu-labels-with-labelattr-and-labeltype)
我想要做的是将 searchAttr 字段“解耦”为2个不同的字段,一个用于搜索,另一个用于在输入内显示。 AFAICT虽然不可能,但我必须扩展FilteringSelect对象
答案 0 :(得分:1)
你可以用AOP做这件事。请参阅dojo/aspect。
警告:向私人功能_announceOption添加建议。
var countryField = new FilteringSelect({
label: 'Country'
, name: 'country_id'
, searchAttr: 'name'
, labelAttr: 'label'
, store: new CountryStore()
});
aspect.around(countryField, '_announceOption', function(origFunction) {
return function(node) {
this.searchAttr = 'label'
var r = origFunction.call(this, node);
this.searchAttr = 'name'
return r;
}
})