2

DOJO データストアから項目をフェッチするとき、DOJO は項目に大量の追加フィールドを追加します。また、データの構造も変更されます。

すべてのアイテムを手動で最初の形式に再構築できることはわかっていますが (REST オブジェクトを変更するたびに、両方の JS コードを更新する必要があります)、確かにもっと良い方法が必要です。

おそらく store.detach( item ) か何かでしょうか?

4

1 に答える 1

1

dojo.dataAPI は段階的に廃止されています。これは、追加のフィールドが原因の1 つです。新しいdojo.storeAPI の使用を検討できます。ストア API は余分なフィールドを追加しません。

私はあなたが探していることをする関数を書きました。続きます。{ _reference: 'id' }注意すべきことの 1 つは、私の関数が子オブジェクトを表記法に変換することです。異なる動作が必要になる場合があります。

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 に答える