从 DOJO 数据存储中获取项目时,DOJO 会为其添加大量额外字段。它还改变了数据的结构方式。
我知道我可以手动将任何项目重建为其初始形式(这将要求我每次更改 REST 对象时都更新两个 JS 代码),但肯定有更好的方法。
也许是 store.detach(item) 或类似的东西?
从 DOJO 数据存储中获取项目时,DOJO 会为其添加大量额外字段。它还改变了数据的结构方式。
我知道我可以手动将任何项目重建为其初始形式(这将要求我每次更改 REST 对象时都更新两个 JS 代码),但肯定有更好的方法。
也许是 store.detach(item) 或类似的东西?
dojo.data
API 正在逐步淘汰,部分原因是额外的字段。您可以考虑使用新的dojo.store
API。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);
};
注意:这个函数是根据我最初写的修改的,我没有测试上面的代码。