2

バージョン 4.1.1 から 4.2.1 への切り替えに取り組んでおり、最終的に最後のバグを修正する必要があります。次のように、単純な (?) Ext.XTemplate によってオーバーライドされたビューを持つグリッドビューがあります。

Ext.define('view.monitoring.Event',
{
    extend: 'Ext.view.View',
    alias: 'widget.default_monitoring_event',

    itemSelector: '.monitoring-thumb-fumb',

    tplWriteMode: 'overwrite',
    autoWidth: true,

    initComponent: function()
    {
        var tplPart1 = new Ext.XTemplate('<SOME HTML 1>');
        var tplPart2 = new Ext.XTemplate('<SOME HTML 2>');
        var tplPart3 = new Ext.XTemplate('<SOME HTML 3>');
        var tplPart4 = new Ext.XTemplate('<SOME HTML 4>');

        this.tpl = new Ext.Template('<BUNCH OF HTML AND TPL and TPL INSIDE TPL',
            callFunc1: function(data) { /* do something with tplPart1 */ },
            callFunc2: function(data) { /* do something with tplPart2 */ },
            callFunc3: function(data) { /* do something with tplPart3 */ },
            callFunc4: function(data) { /* do something with tplPart4 */ },
        );

        this.callParent(arguments;
    }
}

このビューは、次の方法でグリッドに設定されます。

Ext.define('view.monitoring.WeeklyOverview',
{
    extend: 'Ext.grid.Panel',
    alias: 'widget.default_monitoring_weeklyoverview',
    layout: 'border',
    title: Lang.translate('event_monitoring_title'),
    overflowX: 'hidden',
    overflowY: 'auto',

    initComponent: function()
    {
        //...

        this.view = Ext.widget('default_monitoring_event', {
            store: Ext.create('store.monitoring.Rows')
        });

        //...
    }
}

次に、コントローラーonRenderでストアに値が入力されます (グリッドのストアは AJAX であり、データをロードしてビューのメモリ ストアに渡します)。ExtJS 4.1.1 では、これは正しく機能しており、データが読み込まれ、テンプレートが解析され、データを含む HTML が表示されます。

しかし、4.2.1 に切り替えた後、HTML はデータで満たされなくなり、何も表示されず、空の HTML テーブルが表示されます (何もレンダリングされないように見えます)。HTML の少なくとも一部はあるがデータがないため、テンプレートに適用されているデータに問題がある可能性があります。

何が間違っているか知っていますか?

更新:デバッグとカスタム ビュー テンプレートの簡略化の後、カスタム ビューでさえ、返されたデータの独自のルートを持つ独自のストアを設定していることがわかりました。その設定は無視され、Ext.grid.Panelコンポーネントのストアのデータをロードするだけです。AJAX 応答は次のようになります。

{
    user: {},
    data: [
        0: { ... },
        1: { ... },
        ...
    ],
    rows: [
        0: { ... },
        1: { ... },
        ...
    ]
}

ここでをコンポーネントdataに使用し、カスタム ビュー ( で構成) によって を設定する必要があります。子ビューの場合、常に親のストアのルート要素が返されるようです。この動作を回避し、独自のストアを使用するようにカスタム ビューを作成する方法はありますか?Ext.grid.PanelrowsExt.XTemplate

4

1 に答える 1

0

最後に解決策を見つけました。

問題は、メインgrid.Panelがデータをロードした後、それらを (サブ) ビューにも配布することでした。その後、このカスタム XTemplate に適切なデータを手動でロードした後でも、以前にレンダリングされたビューを手動でオーバーライドする必要がありました。

私のコントローラー(init -> render)では、これを行う必要がありました:

    var me = this;
    this.getMainView().store.load({
        params: params || {},
        callback: function(records, operation, success) {
            // this line was already there, working properly for ExtJS 4.1.1, probably is now useless for ExtJS 4.2.1 with the next line
            me.getCustomView().store.loadRawData(this.proxy.reader.rawData);
            // I had to add this line for ExtJS 4.2.1...
            me.getCustomView().tpl.overwrite(me.getCustomView().el, this.proxy.reader.rawData.rows);
        }
    });

カスタムビュー内で定義すると思ったので、これはちょっと奇妙です(上記の私の質問を参照してください)

tplWriteMode: 'overwrite',

ビューを自動的に上書きする必要があります...

于 2013-08-16T15:26:23.740 に答える