如何创建dojo组合框下拉列表

时间:2015-06-25 11:50:39

标签: javascript combobox dojo treeview

我为dojo组合框创建了dojo div元素。现在我想创建一个类似树的结构来选择下拉值。我想使用读取或写入存储(dojo / data / ItemFileReadStore)通过java脚本文件在div元素中附加树对象.....

我正在尝试下面的html和js文件,但我收到以下错误消息。 没有这样的方法dom.byId

组合框的div元素:

<div>
<tr>
<td><label for="fixedSubCategory">Fixed SubCategory</label></td>
<td><select data-dojo-type="dijit/form/ComboBox"
id="fixedSubCategory" name="fixedSubCategory" value="">             
</select></td>
</tr>

附加树对象的JS文件:

var displayData ={
"identifier":"id",
"label":"name",
"items":[
{
    "type": "parent",
        "name": "Countries",
        "id": "countries",
        "children":[
        {"type":"Leaf", "name":"Country 1", "id":"country1"},
        {"type":"Leaf", "name":"Country 2", "id":"country2"},
        {"type":"Leaf", "name":"Country 3", "id":"country3"},
        {"type":"Leaf", "name":"Country 4", "id":"country4"},
        {"type":"Leaf", "name":"Country 5", "id":"country5"},
        {"type":"Leaf", "name":"Country 6", "id":"country6"}
    ]
    }]}

    var store1 = new dojo.data.ItemFileReadStore({ data: displayData });

    var treeModel = new dijit.tree.ForestStoreModel({
    store: store1,
    query: {"type": "parent"},
            rootId: "root",
            rootLabel: "Groups",
            childrenAttrs: ["children"]
        });

        var treeObject = new dijit.Tree({
            model: treeModel
        }, "treeDiv")

        if (dijit.byId("fixedSubCategory") != null) {

                dom.byId("fixedSubCategory").appendChild(treeObject.domNode);
                treeObject.startup();

            }

2 个答案:

答案 0 :(得分:0)

通常,dom.byId()等可以在适当的AMD模块的上下文中看到,例如:

define([ 'dojo/dom', ... ], function (dom, ...) {
    // do something with dom.byId
});

如果您正在编写AMD格式的模块(非常鼓励这样做),请确保实际将dojo/dom模块包含在依赖项列表中,并将模块分配给工厂中的dom参数函数(如果您认为已经在执行此操作,请确保依赖项数组和函数参数顺序匹配)。然后它应该工作正常。

(此外,引用dijit.byId的适当方式是通过dijit/registry模块,而不是dijit全局模块。)

另一方面,看起来你的大多数其他代码都没有真正使用AMD格式(例如dojo.datadijit.tree等)。虽然建议更新为AMD格式(好像你曾在Populating ComboBox dynamically in dojo中使用domAttr),但非AMD,全球等同于dom.byIddojo.byId

答案 1 :(得分:0)

最简单的方法是使用组合框,我想。

我们这样管理: “结果”是对我们的街形文件进行查询的结果。

function streetsToCombobox(results){

    var adress;
    var values = [];
    var testVals={};

    var features = results.features;

    require(["dojo/_base/array","dojo/store/Memory","dijit/form/ComboBox"],    
    function(array,Memory,Combobox){        
       if (!features[0]) {
          alert(noDataFound);
       }
    else {
        array.forEach(features, function(feature, i){
            adress = feature.attributes.STRASSE;

 //Check for doublefeatures
            if (!testVals[adress]) {
                testVals[adress] = true;
                values.push({
                    name: adress
                });
            }

        });
        values.sort(SortByName);

        var dataItems = {
            identifier: 'name',
            label: 'name',
            items: values
        };

            storeStreet = new Memory({
                data: dataItems
            });

    }
var comboBox = new ComboBox({
    id: "MyCB",
    name: "street",
    value: "",
    store: storeStreet ,
    searchAttr: "name"
},"DomeNodeForBox");

});
}

对于所有进一步的信息,请仔细查看文档:{​​{3}}