如何删除DOJO数据存储区添加到我提取的项目中的所有额外字段?

时间:2012-05-18 11:53:49

标签: javascript rest dojo datastore

从DOJO数据存储区中获取项目时,DOJO会为其添加大量额外字段。它还改变了数据结构的方式。

我知道我可以手动重建任何项目到它的初始形式(这将要求我每次更改我的REST对象时都对这两个JS代码进行更新),但肯定有更好的方法。

也许是store.detach(item)或类似的东西?

1 个答案:

答案 0 :(得分:1)

dojo.data API正在逐步淘汰,部分原因是额外的字段。您可以考虑使用新的dojo.store API。商店api不会添加额外的字段。

我写了一个功能,可以完成你想做的事情。它跟随。有一点需要注意,我的函数将子对象转换为{ _reference: 'id' }表示法。你可能想要不同的行为。

Util._detachItem = function(item) {
    var fnIncludeProperty = function(key) {
        return key !== '_0'
            && key !== '_RI'
            && key !== '_RRM'
            && key !== '_S'
            && key !== '__type'
    };

    var store = item._S;

    var fnCreateItemReference = function(itm) {
        if (store.isItem(itm)) {
            return { _reference: itm.id[0] };
        }
        return itm;
    };

    var fnProcessItem = function(itm) {
        var newItm = {};
        for(var k in itm) {
            if(fnIncludeProperty(k)) {
                if (dojo.isArray(itm[k])) {
                    // TODO this could be a problem with arrays with a single item
                    if (itm[k].length == 1) { 
                        newItm[k] = fnCreateItemReference(itm[k][0]);
                    } else {
                        var valArr = [];
                        dojo.forEach(itm[k], function(arrItm) {
                            valArr.push(fnCreateItemReference(arrItm));
                        });
                        newItm[k] = valArr;
                    }
                } else {
                    newItm[k] = fnCreateItemReference(itm[k]);
                }
            }
        }
        return newItm;
    };

    return fnProcessItem(item);
};

注意:此功能是根据我最初编写的内容修改的,我没有测试上面的代码。