为一个dojo小部件(dijit / form / FilteringSelect)同时设置两个不同的内存存储

时间:2015-01-21 07:05:24

标签: dojo

我有两种不同的JSON结构。一个代表系统的各个用户,另一个代表由这些用户组成的组。所以,我用这些创建了两个内存存储(每个都有不同的idProperty - userId和groupId)。

我有一个filteringSelect下拉列表,我的要求是将这两个作为列表的数据存储添加,以便可以从下拉列表中选择有效用户或有效组。

我可以想到这样做的两种可能方式: 1)通过创建两个JSON的一个公共内存存储 - 但idProperty是不同的,因此不确定这是如何可能的 2)通过将两个内存存储添加到窗口小部件,但又不同的idProperty,所​​以不确定。

我对使用Dojo非常新,所以任何帮助都会真正得到应用。提前谢谢!

1 个答案:

答案 0 :(得分:1)

我认为,如果你使用商店来表示某些东西(模型数据),它应该被形成,以便它可以在一个小部件中正确使用。

所以在你的情况下,我会将它们都添加到一个商店。如果它们具有不同的ID(例如,当它是后端服务的结果时),那么您可以将两种类型的模型映射到单个对象结构中。例如:

var groups = [{
    groupId: 1,
    groupName: "Group 1",
    users: 10
}, {
    groupId: 2,
    groupName : "Group 2",
    users: 13
}, {
    groupId: 3,
    groupName : "Group 3",
    users: 2
}];

var users = [{
    userId: 1,
    firstName: "John",
    lastName: "Doe"
}, {
    userId: 2,
    firstName: "Jane",
    lastName: "Doe"
}, {
    userId: 3,
    firstName: "John",
    lastName: "Smith"
}];


require(["dojo/store/Memory", "dijit/form/FilteringSelect", "dojo/_base/array", "dojo/domReady!"], function(Memory, FilteringSelect, array) {
    var filterData = array.map(groups, function(group) {
        return {
            id: "GROUP" + group.groupId,
            groupId: group.groupId,
            name: group.groupName,
            type: "group"
        };
    });
    Array.prototype.push.apply(filterData, array.map(users, function(user) {
        return {
            id: "USER" + user.userId,
            userId: user.userId,
            name: user.firstName + " " + user.lastName,
            type: "user"
        };
    }));
});

在此示例中,我们有两个数组groupsusers,为了合并它们,我使用了map() dojo/_base/array函数,然后我连接了两个结果。< / p>

它们仍然包含原始ID和类型,因此您仍然可以引用原始对象。

根据我之前的经验,我了解到您的模型数据不应代表纯粹的业务数据,而应代表在视图/用户界面中易于使用的数据。

通过为两个数组提供类似的对象结构,您可以在dijit/form/FilteringSelect中轻松使用它们,您可以在此处看到:http://jsfiddle.net/ut5hjbyb/