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

set two different memory stores for one dojo widget (dijit/form/FilteringSelect) at the same time

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

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

我想到了两种可能的方法: 1) 通过创建两个 JSONs 的一个公共内存存储 - 但 idProperty 不同所以不确定这是怎么可能的 2) 通过将内存存储添加到小部件,但又添加了不同的 idProperty,所​​以不确定。

我对使用 Dojo 还很陌生,所以非常感谢任何帮助。提前致谢!

我认为,如果您使用商店来表示某物(模型数据),则应该形成它以便它可以在小部件中正确使用。

因此,在您的情况下,我会将它们都添加到一个商店中。如果它们具有不同的 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,为了合并它们,我使用了 dojo/_base/arraymap() 函数,然后我连接了两个结果.

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

根据我以前的经验,我知道你的模型数据不应该代表纯粹的业务数据,而是在view/user界面中容易使用的数据。

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