1

ここに私が持っているものがあります: ここに画像の説明を入力

ボックスの 1 つをクリックすると、以下のリストがサーバー側でフィルタリングされます。

グリッド内の行を選択してフィルターをコミットすると、次のエラーが発生します。

「ローカル キャッシュに存在しない ID に対して getById が呼び出されました」

ここに画像の説明を入力

これは、フィルターに選択したレコードが含まれていても発生します。

モジュールは次のとおりです。

Ext.define('NG.model.auxClasses.notifications.WhatsNew', {
    extend: 'Ext.data.Model',
    idProperty: 'iD',
    autoLoad: true,
    fields: [
        { name: 'iD', type: 'int' },
        { name: 'isActive', type: 'boolean' },
        { name: 'documentIdentifier', type: 'string' },
        { name: 'sourceSiteName', type: 'string' },
        { name: 'targetSiteName', type: 'string' },
        { name: 'createDate', type: 'date', dateFormat: 'c' },
        { name: 'businessArchiveEvent', type: 'string' },
        { name: 'businessArchive', type: 'string' },
        { name: 'previousWhatsNewEvents' },
        { name: 'isPin', type: 'boolean' },
        { name: 'IsDocumentReadByMe', type: 'boolean' },
        { name: 'isDocumentReadByOthers', type: 'boolean' },
        { name: 'documentYear', type: 'int' },
        { name: 'businessDirection', type:'int'}
    ],

    // self association model
    associations: [{
        type: 'hasMany',
        model: 'auxClasses.notifications.WhatsNew',
        name: 'previousWhatsNewEvents',
        primaryKey: 'id',
        associationKey: 'previousWhatsNewEvents'
    }],

    proxy: {
        type: 'rest',
        url: 'api/WhatsNew/'
    }

});

店舗はこちら:

Ext.define('NG.store.WhatsNews', {
    extend: 'NG.store.AbstractStore',
    model: 'NG.model.auxClasses.notifications.WhatsNew',
    alias: 'store.whatsnewstore',
    autoLoad:true,
    buffered: true,
    pageSize: 50
});

アップデート:

ウサギを追って穴まで行ったところ、うまくいくかどうかわからない回避策が見つかりました。

これが私が失敗した場所です:

refresh: function() {
        ...

        // Don't need to do this on the first refresh
        if (me.hasFirstRefresh) {
        // Some subclasses do not need to do this. TableView does not need to do this.                   
               if (me.refreshSelmodelOnRefresh !== false) {
                    me.selModel.refresh();
                } else {
                    // However, even if that is not needed, pruning if pruneRemoved is true (the default) still needs doing.
                    me.selModel.pruneIf(); <<< HERE WE FAIL. THIS METHODS CALLS THE GET BY ID
                }
            }

           ...
    }

したがって、私のビューでは、次のビュー構成を追加しました。

viewConfig: {
        refreshSelmodelOnRefresh:true // Workaround : if this is not set to true when the grid will refresh and a record will be selected we will get an ext error 
    },

これにより、発生したエラーは解決されましたが、最終結果とそれが後で害を及ぼす可能性があるかどうかはわかりません.

誰かが光を遮ることができれば...

そのための回避策はありますか?

4

5 に答える 5

1

あなたができることがいくつかあります-

  1. pageSize を少なくとも 100 に増やしてください。バッファ ストアは実際には小さなレコードセット用には設計されていません。

  2. 以下のオーバーライドを使用します。

このオーバーライドは、store がバッファー型の場合の複数のバグを修正し、store.getById() メソッドがレコードではなく ID を想定しているため、最初の hasId が機能しないバグを修正しました。また、レコードが見つからない場合に二重検証を強制します。両方のチェックを 1 つの if ステートメントに配置するためです。

@src: http://www.sencha.com/forum/showthread.php?258397-4.2.0-RC-Selecting-a-grid-s-row-with-a-buffered-store-causes-a-JavaScript -エラー/ページ 2

 Ext.override(Ext.selection.Model, {
  storeHasSelected: function(record) {
    var store = this.store,
        records,
        len, id, i, m;

    if (record.hasId()) {
        return store.getById(record.getId());
    } else {
        if (store.buffered) {//on buffered stores the map holds the data items
            records = [];
            for (m in store.data.map) {
                records = records.concat(store.data.map[m].value);
            }
        } else {
            records = store.data.items;
        }
        len = records.length;
        id = record.internalId;


        for (i = 0; i < len; ++i) {
            if (id === records[i].internalId) {
                return true;
            }
        }
    }
    return false;
  }
});

1 つも 2 つも機能しない場合は、次を試してください。

Ext.view.AbstractView.override({
    refresh: function() {
        var me = this,
            targetEl,
            targetParent,
            oldDisplay,
            nextSibling,
            dom,
            records;

        if (!me.rendered || me.isDestroyed) {
            return;
        }

        if (!me.hasListeners.beforerefresh || me.fireEvent('beforerefresh', me) !== false) {
            targetEl = me.getTargetEl();
            records = me.getViewRange();
            dom = targetEl.dom;

            // Updating is much quicker if done when the targetEl is detached from the document, and not displayed.
            // But this resets the scroll position, so when preserving scroll position, this cannot be done.
            if (!me.preserveScrollOnRefresh) {
                targetParent = dom.parentNode;
                oldDisplay = dom.style.display;
                dom.style.display = 'none';
                nextSibling = dom.nextSibling;
                targetParent.removeChild(dom);
            }

            if (me.refreshCounter) {
                me.clearViewEl();
            } else {
                me.fixedNodes = targetEl.dom.childNodes.length;
                me.refreshCounter = 1;
            }

            // Always attempt to create the required markup after the fixedNodes.
            // Usually, for an empty record set, this would be blank, but when the Template
            // Creates markup outside of the record loop, this must still be honoured even if there are no
            // records.
            me.tpl.append(targetEl, me.collectData(records, me.all.startIndex));

            // The emptyText is now appended to the View's element
            // after any fixedNodes.


            if (typeof records !== 'undefined' && records !== undefined && records && records.length < 1) { 
                // Process empty text unless the store is being cleared.
                if (!this.store.loading && (!me.deferEmptyText || me.hasFirstRefresh)) {
                    Ext.core.DomHelper.insertHtml('beforeEnd', targetEl.dom, me.emptyText);
                }
                me.all.clear();
            } else {
                me.collectNodes(targetEl.dom);
                me.updateIndexes(0);
            }

            // Don't need to do this on the first refresh
            if (me.hasFirstRefresh) {
                // Some subclasses do not need to do this. TableView does not need to do this.
                if (me.refreshSelmodelOnRefresh !== false) {
                    me.selModel.refresh();
                } else {
                    // However, even if that is not needed, pruning if pruneRemoved is true (the default) still needs doing.
                    me.selModel.pruneIf();
                }
            }

            me.hasFirstRefresh = true;

            if (!me.preserveScrollOnRefresh) {
                targetParent.insertBefore(dom, nextSibling);
                dom.style.display = oldDisplay;
            }

            // Ensure layout system knows about new content size
            this.refreshSize();

            me.fireEvent('refresh', me);

            // Upon first refresh, fire the viewready event.
            // Reconfiguring the grid "renews" this event.
            if (!me.viewReady) {
                // Fire an event when deferred content becomes available.
                // This supports grid Panel's deferRowRender capability
                me.viewReady = true;
                me.fireEvent('viewready', me);
            }
        }
    }
});
于 2013-11-13T13:08:47.303 に答える
1

私のコードでは、グリッドでバッファリングされたストアを使用すると、このエラーが発生します。

私はこれで解決しました

selModel: {
    pruneRemoved: false
}
于 2015-07-08T06:37:56.520 に答える
0

このオーバーライドを試してください

    Ext.data.Store.override({
        getById: function(id) {
            var result = (this.snapshot || this.data).findBy(function(record) {
                return record.getId() === id;
            });
            if (this.buffered && !result) {
                return [];
            }
            return result;
        }
    });
于 2014-05-24T20:59:30.887 に答える
0

ExtJS 5 の場合、Store ではなく BufferedStore をオーバーライドします。

Ext.data.BufferedStore.override({
    getById: function(id) {
        var result = (this.snapshot || this.data).findBy(function(record) {
            return record.getId() === id;
        });
        if (this.buffered && !result) {
            return [];
        }
        return result;
    }
});
于 2015-02-26T10:45:33.197 に答える