0

StackOverflow に関する私の最初の質問です。あまり責めないでください ;)

ロードされたコンテンツと ajax リクエストを含むグリッドを表示するインターフェイスを作成する必要があります。

この時点で、何も難しいことはありません。php/mysql スクリプトから値を取得してグリッドに表示するために、モデル、ストア、およびプロキシを作成することができました。

しかし、返されたデータには、別の MySQL テーブルに格納されている同等の値に変換する必要がある ID がいくつかあります。

そして、この時点で私は立ち往生しており、何時間も検索した後でも、ID 値を別のストア/モデルのラベルに再マップする方法がわかりません。

コードは次のとおりです。

パネル ビュー :

Ext.define('Audiotel.views.TimeRangePanelView', {
extend : 'Ext.grid.Panel',
config : {
    columns : [{
        header : 'Start date',
        dataIndex : 'slo_time_start',
        editor : {
            xtype : 'timefield',
            format : 'H:i:s',
            increment : 60 // In minutes
        },
        renderer : function(value, metaData, record, rowIndex, colIndex, store, view) {
            return value;
        }
    }, {
        header : 'End Date',
        dataIndex : 'slo_time_end',
        editor : {
            xtype : 'timefield',
            format : 'H:i:s',
            increment : 60 // In minutes
        },
        renderer : function(value, metaData, record, rowIndex, colIndex, store, view) {
            return value;
        }
    }, {
        header : 'Days',
        dataIndex : 'slo_valid_days',
        editor : Ext.create('Ext.form.field.ComboBox', {
            typeAhead : true,
            triggerAction : 'all',
            selectOnTab : true,
            store : [['Everyday', 'Everyday'], ['WE and holiday', 'WE and holiday'], ['Week', 'Week']],
            lazyRender : true,
            listClass : 'x-combo-list-small'
        })
    }, {
        header : 'Range',
        dataIndex : 'slo_hou_id',
        editor : Ext.create('Ext.form.field.ComboBox', {
            selectOnTab : true,
            store : [['1', 'Peak'], ['2', 'Offpeak'], ['3', 'Night']],
            listClass : 'x-combo-list-small',
        }),
        renderer : function(value, metaData, record, rowIndex, colIndex, store, view) {
            return value;
        }
    }],
    height : 400,
    width : '100%',
    store : Audiotel.stores.StoreBuilder.factory('TimeRange').createStore('getDefaultTimeRange'),
    renderTo : "range_table_div",
    frame : true
},

constructor : function() {
    this.callParent()
}
});

ストア ビルダー (プロキシを使用) :

Ext.define('Audiotel.stores.StoreBuilder', {

statics : {
    instance: null,
    factory: function(name) {
        if(!this.instance){
            this.instance = new this({storeName: name});
        }
        return this.instance;
    }
},

storeName: null,

config: {
    storeName: ''
},

constructor: function(config){
        this.initConfig(config);
},

applyStoreName: function(name){
    if(!name){
        throw new Error('['+ Ext.getDisplayName(arguments.callee) +'] Name of store to create.');
    }
    return name;
},


createStore: function(proxyMethod, proxyParams){
    var modelName = Audiotel.utils.AppUtils.BASE_PATH+'.'+Audiotel.utils.AppUtils.MODEL_PATH+'.'+this.getStoreName()+'Model';
    Ext.Loader.syncRequire(modelName);  
    return Ext.create('Ext.data.Store', {
            autoLoad: true,
            proxy: Ext.create('Audiotel.proxies.AudiotelProxyWrapper', {method: proxyMethod, params: proxyParams}).getWrappedProxy(),
            model:  modelName,
            storeId:    this.getStoreName()+'Store'
        });
}
});

モデル :

Ext.define('Audiotel.models.TimeRangeModel', {
extend : 'Ext.data.Model',
alias : 'TimeRange',
fields : [{
    name : 'slo_time_start',
    type : 'string'
}, {
    name : 'slo_time_end',
    xtype : 'string'
}, {
    name : 'slo_valid_days',
    type : 'string'
}, {
    name : 'slo_hou_id',
    type : 'string'
}]
});

変換したい値は「slo_hou_id」で、「Peak」ではなく「1」が表示されています。

助けてくれてありがとう!

ps : 私は ExtJS を初めて使用します...

編集 :

他のテーブル値用に新しいストアを作成しました:

Ext.define('Audiotel.models.HoursModel', {
extend : 'Ext.data.Model',
alias : 'Hours',
fields : [{
    name : 'hou_id',
    type : 'int'
}, {
    name : 'hou_label',
    xtype : 'string'
}]
});

そして、データをロードしました:

[{"hou_id":"1","hou_label":"Heures pleines"},{"hou_id":"2","hou_label":"Heures creuses"},{"hou_id":"3","hou_label":"Heures nuit"}]

しかし、値を検索しようとすると、失敗するようです:

var hours = Audiotel.stores.StoreBuilder.factory('Hours').createStore('getHoursValues');

console.log(hours.getById(1));
console.log(hours.findRecord('hou_id', 1));

すべてがnullを返します... :(

4

1 に答える 1

0

次の 2 つのオプションがあります。

  1. 最初のオプションは、Javascript で「結合」を行う代わりに、MySQL から必要なものを返すことです。したがって、MySQL/PHP からは、「1」ではなく「Peak」を返します。
  2. 「Store.find*」関数を使用して、「1」を「Peak」にマップします。のようなものother_store.findRecord('slo_hou_id', 1).attribute_you_want
于 2012-07-09T10:37:37.460 に答える