带有复杂下拉菜单的dijit.form.ComboBox

时间:2011-02-22 06:37:36

标签: dojo dijit.form

我想创建一个更有趣的博客自动完成小部件;一个将返回一个下拉菜单,其中包含:(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而不是简单的字符串。正如我上面提到的,这种方法的一个缺点是它将数据与表示混合在一起。

问题:因此,我有两个选择,但两者都不完美。有没有更好的办法?如果不是 - 你推荐哪一个?

2 个答案:

答案 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的记录,并应在升级时检查。更好的是,提供一个补丁,用于挂钩自己的弹出窗口小部件并提交它,确保下一个版本具有您想要在其中看到的更改:)