Как мне удалить все дополнительные поля, которые DOJO datastore добавляет к моим выбранным элементам?

При извлечении элемента из хранилища данных DOJO DOJO добавляет к нему множество дополнительных полей. Это также меняет структуру данных.

Я знаю, что мог бы вручную перестроить любой элемент в его первоначальную форму (это потребовало бы от меня обновления обоих JS-кодов каждый раз, когда я меняю свой объект REST), но, безусловно, должен быть лучший способ.

Возможно store.detach(предмет) или что-то в этом роде?

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);
};

ПРИМЕЧАНИЕ: эта функция изменена по сравнению с тем, что я написал изначально, и я не тестировал приведенный выше код.

Другие вопросы по тегам