2

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

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

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

4

1 回答 1

1

dojo.dataAPI 正在逐步淘汰,部分原因是额外的字段。您可以考虑使用新的dojo.storeAPI。store 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);
};

注意:这个函数是根据我最初写的修改的,我没有测试上面的代码。

于 2012-05-18T14:03:28.057 回答