1

次のグリッドコンポーネントを作成しました。

MyApp.grids.RelationshipMemberGrid = Ext.extend(Ext.grid.GridPanel, {
    autoHeight: true,
    iconCls: 'icon-grid',
    title: 'Relationship Members',
    frame: true,
    viewConfig: { forceFit: true },
    relationshipId: null,
    documentId: null,

    initComponent: function () {
        if (this.verifyParameters()) {
            // Initiate functionality
            this.columns = this.buildColumns();
            this.view = this.buildView();
            this.store = this.buildStore();
            this.store.load();
        }

        MyApp.grids.RelationshipMemberGrid.superclass.initComponent.call(this);
    },

    verifyParameters: function () {
        // Verification code
    },

    buildColumns: function () {
        return [{
            header: 'Id',
            dataIndex: 'Id',
            sortable: true,
            width: 10
        }, {
            header: 'Type',
            dataIndex: 'ObjType',
            sortable: true,
            width: 10
        }, {
            header: 'Name',
            dataIndex: 'Name',
            sortable: true
        }];
    },

    buildView: function () {
        return new Ext.grid.GroupingView({
            forceFit: true,
            groupTextTpl: '{text} ({[values.rs.length]} {[values.rs.length > 1 ? "Members" : "Member"]})'
        });
    },

    buildStore: function () {
        return new Ext.data.GroupingStore({
            url: MyAppUrls.ListRelationshipMembers,
            baseParams: { relationshipId: this.relationshipId },
            root: 'data',
            fields: ['Id', 'ObjType', 'Name'],
            sortInfo: { field: 'Name', direction: 'ASC' },
            groupField: 'ObjType'
        });
    }
});

グリッドは正しくレンダリングされ、マップされているURLMyAppUrls.ListRelationshipMembersは正しいです。データが取得されており、ListRelationshipMembersURLは次のJSONを返しています。

{"data":[{"Id":1,"ObjType":"topic","Name":"Test2"}]}

ただし、グリッドがレンダリングされていても(列、境界線など)、実際のグリッドにはデータが表示されません。データストアを使用するのはこれが初めてなので、何が間違っているのかわかりません。どんな助けでも感謝するでしょう。

編集

次のコードを使用して、ストアを更新してリーダーを作成してみました。

    return new Ext.data.GroupingStore({
        url: MyAppUrls.ListRelationshipMembers,
        baseParams: { relationshipId: this.relationshipId },
        fields: ['Id', 'ObjType', 'Name'],
        sortInfo: { field: 'Name', direction: 'ASC' },
        reader: new Ext.data.JsonReader({
            root: 'data' 
        }),
        groupField: 'ObjType'
    });

変更なし、データグリッドはレコードで埋められていません

4

3 に答える 3

1

ここでいくつかのことを行う必要があると考えてください。まず、Evanが述べたように、次のようにストアにリーダーを追加する必要があります。

buildStore: function () {
    return new Ext.data.Store({
        url: MyAppUrls.ListRelationshipMembers,
        baseParams: { relationshipId: this.relationshipId },
        fields: ['Id', 'ObjType', 'Name'],
        sortInfo: { field: 'Name', direction: 'ASC' },
        reader: new Ext.data.JsonReader({
            root: 'data' 
        })
    });
}

ここでストアタイプをより単純なものに変更しました-GroupingStoreを使用していた特別な理由はありましたか?ルートはストア自体ではなく、リーダーで指定されることに注意してください。

次に、列に、各列に表示される内容を明示的に決定するレンダラーを追加する傾向があります。たとえば、次のようになります。

buildColumns: function () {
    return [{
        header: 'Id',
        dataIndex: 'Id',
        sortable: true,
        width: 10,
        renderer: function (value, metaData, record) {
            return record.data.Id
        }
    } ... ];
}

グリッド内の列セルのコンテンツをかなり大幅に変更するため、レンダラーを使用する習慣があります。ここで、レンダラー関数に渡される引数に注意してください。渡すことができるものは他にもいくつかあります。実際にアクセスできるものについてさらに情報が必要な場合は、 ExtJSAPIを参照してください。その点で、APIドキュメントはかなり良いです-それは少し掘り下げる必要がありますが、ExtJSをたくさん使っているなら間違いなくあなたの時間の価値があります。

于 2010-12-17T16:35:00.013 に答える
1

エヴァンは正しいです。あなたの最大の問題は、読者の不足です。それとそこに残した検証スタブはtrueを返す必要がありました。このコードをドロップして機能させることができない場合は、他の問題があります。

MyApp.grids.RelationshipMemberGrid = Ext.extend(Ext.grid.GridPanel, {
    autoHeight: true,
    iconCls: 'icon-grid',
    title: 'Relationship Members',
    frame: true,
    viewConfig: { forceFit: true },
    relationshipId: null,
    documentId: null,

        initComponent: function () {
        if (this.verifyParameters()) {
            // Initiate functionality
            this.columns = this.buildColumns();
            this.view = this.buildView();
            this.store = this.buildStore();
            this.store.load();
        }

        MyApp.grids.RelationshipMemberGrid.superclass.initComponent.call(this);
    },

    verifyParameters: function () {
        // Verification code
        return true;
    },

    buildColumns: function () {
        return [{
            header: 'Id',
            dataIndex: 'Id',
            sortable: true,
            width: 10
        }, {
            header: 'Type',
            dataIndex: 'ObjType',
            sortable: true,
            width: 10
        }, {
            header: 'Name',
            dataIndex: 'Name',
            sortable: true
        }];
    },

    buildView: function () {
        return new Ext.grid.GroupingView({
            forceFit: true,
            groupTextTpl: '{text} ({[values.rs.length]} {[values.rs.length > 1 ? "Members" : "Member"]})'
        });
    },

    buildStore: function () {
        return new Ext.data.GroupingStore({
            url: MyAppUrls.ListRelationshipMembers,
            baseParams: { relationshipId: this.relationshipId },
            reader: new Ext.data.JsonReader({
                root: 'data',
                fields: ['Id', 'ObjType', 'Name'],
                sortInfo: { field: 'Name', direction: 'ASC' },
                groupField: 'ObjType'
            })
        });
    }
});
于 2010-12-19T19:21:35.693 に答える
0

ストアでリーダーを指定していないので、JsonReaderでルートを指定する必要があります。

于 2010-12-17T06:00:26.727 に答える