我想创建一个更有趣的博客自动完成小部件;一个将返回一个下拉菜单,其中包含:(a)标题,(b)关键字,(d)日期。 E.g:
|======================
| inte|
|======================
| Interesting Title
| Tags: title, bar
| Date: Jun, 12 2010
|----------------------
| Interner Guide
| Tags: guide
| Date: Aug, 12 2010
|----------------------
| ...
|======================
予。第一个选项
实现这一目标的一种方法是覆盖_ComboBoxMenu的_createOption,如下所示:
dojo.declare("SearchBox", dijit.form.ComboBox, {
postMixInProperties: function() {
this._popupWidget = new SearchBoxMenu();
this.inherited(arguments);
}
});
dojo.declare("SearchBoxMenu", dijit.form._ComboBoxMenu, {
_createOption: function(item, labelFunc) {
var menuitem = dojo.doc.createElement("li");
menuitem.innerHTML = [
"<ul>",
"<li>", store.getValue(item, "title"), "</li>",
"<li>Tags: ", store.getValue(item, "tags"), "</li>",
"<li>Date: ", store.getValue(item, "date"), "</li>"
"</ul>"
].join("")
return menuitem;
}
});
但我(a)重写私有类,然后(b)它是私有方法,所以如果方法签名在dojo 1.6中为这些类更改 - 我将遇到麻烦。这使得这种方式有点不合需要。
II。第二个选项
如果私有API签名发生更改,第二种方式不会中断,但会将数据与表示混合:
var myStore = new dojo.data.ItemFileReadStore({
data: {
identifier: "title",
items: [
{title: "Interesting Title",
tags: "title, bar",
date: "Jun, 12 2010",
label: "<ul><li>Interesting Title</li>"
+ "<li>Tags: title, bar</li>"
+ "<li>Date: Jun, 12 2010</li></ul>"}
]
}
});
var box = new dijit.form.ComboBox({
store: myStore,
searchAttr: "title",
labelAttr: "label",
labelType: "html"
}, "ipt1"),
labelAttr告诉ComboBox查看dataStore的items []。label并在下拉菜单中使用它。 “labelType”告诉_ComboBoxMenu将其包含为HTML而不是简单的字符串。正如我上面提到的,这种方法的一个缺点是它将数据与表示混合在一起。
问题:因此,我有两个选择,但两者都不完美。有没有更好的办法?如果不是 - 你推荐哪一个?
答案 0 :(得分:4)
“自动完成”测试页面上的富文本测试中描述了答案:http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/_autoComplete.html#richtextest。
让我感觉好一点的唯一原因是我之前尝试过这个解决方案,而且它与dojo 1.5不兼容。它确实适用于夜莺,并希望随后的所有稳定构建。它是选项2和标签视图功能的组合:
var myStore = new dojo.data.ItemFileReadStore({
data: {
identifier: "title",
items: [
{title: "Interesting Title",
tags: "title, bar",
date: "Jun, 12 2010"}
]
}
});
var box = new dijit.form.ComboBox({
autoComplete: false,
selectOnClick: true,
store: myStore,
searchAttr: "title",
labelType: "html",
labelFunc: function(item, store) {
return [
"<ul>",
"<li>", store.getValue(item, "title"), "</li>",
"<li>Tags:", store.getValue(item, "tags"), "</li>",
"<li>Date:", store.getValue(item, "date"), "</li>",
"</ul>"
].join("")
}
}, "ipt1");
答案 1 :(得分:0)
我认为没有更好的方法。
就个人而言,我会选择选项1并保留您正在使用的所有私有API的记录,并应在升级时检查。更好的是,提供一个补丁,用于挂钩自己的弹出窗口小部件并提交它,确保下一个版本具有您想要在其中看到的更改:)