0

ここに店があります:

Ext.define( 'LFinanceCRM.store.Prospect', {
    extend         : 'Ext.data.Store',
    buffered       : false,
    autoLoad       : true,
    remoteFilter   : true,
   storeId        : 'prospect-store',
    proxy          : {
        type        : 'ajax',
        url         : 'services/getProspect.php',
        filterParam : undefined,
      limitParam  : undefined,
      startParam  : undefined,
        pageParam   : undefined,
        idParam     : 'id',
        reader      : {
            type : 'json',
            root : 'prospect'
        }
    },
    fields       : [
        { name : 'id'    },
       { name : 'value' }
    ],
    constructor  : function(){
        this.callParent( arguments );
        console.log( 'new ' + this.self.getName());
    }
});

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

<?php
include_once 'db.php';

header( "Content-type: application/json; charset=utf-8" );

$id     = @mysql_real_escape_string($_GET['id']);
$link   = db_open();
$query  = "SELECT name, value FROM Pairs WHERE id = '$id'";
$result = @mysql_query( $query, $link );
$pairs = array();
if( $result ) {
    while( $row = mysql_fetch_assoc( $result )) {
        $item = Array();
        $item['id'   ] = $row['name' ];
        $item['value'] = $row['value'];
        $pairs[] = $item;
    }
}
$response = array( 'prospect' => $pairs );
print json_encode( $response );
@mysql_free_result( $result );
@mysql_close( $link );
?>

PHP から受け取った JSON は次のとおりです。

{prospect:[
   {id:'aaa',value:'vvvv'},
   {id:'bbb',value:'vvvv'},
   ...
   {id:'yyy',value:'vvvv'},
   {id:'zzz',value:'vvvv'},
}]

ビューは次のとおりです。

Ext.define( 'LFinanceCRM.view.RawDataView', {
   extend      : 'Ext.grid.Panel',
   requires    :[],
   alias       : 'widget.raw-data-view',
   autoScroll  : true,
   title       : 'Données brutes',
   columnLines : true,
   viewConfig  : { stripeRows : true },
   store       : Ext.data.StoreManager.lookup( 'prospect-store' ),
   columns     : [{
      text      : 'Nom',
      dataIndex : 'name',
      sortable  : false,
      width     : '29%'
   },{
      text      : 'Valeur',
      dataIndex : 'value',
      sortable  : true,
      width     : '70%'
   }],
   constructor : function() {
      this.callParent( arguments );
      console.log('new ' + this.self.getName());
   }
});

Sencha アプリ ビルド ツールでサポートされている MVC パターンを使用します。コントローラーは次のとおりです。

Ext.define( 'LFinanceCRM.controller.Main', {
   extend    : 'Ext.app.Controller',
   id        : 'theController',
   onNonLuesSelectionChanged : function( panel, selected, eOpts ) {
      console.log('onNonLuesSelectionChanged: ' + selected[0].data.id );
      this.getStore('Prospect').load({
         id       : selected[0].data.id,
         callback : function( records, operation, success ) {
            var pairs = [];
            for( var i = 0; i < records.length; ++i ) {
               pairs.push( records[i].data );
            }
            Ext.ComponentQuery.query('client-view')[0].getForm().setValues( pairs );
            Ext.ComponentQuery.query('immo-view'  )[0].getForm().setValues( pairs );
        }
      });
   },
   onSavePairs : function() {
      console.log('onSavePairs');
   },
   ...
   onMail : function() {
      console.log('onMail');
   },
   ...
   stores : ['Prospect'],
   constructor : function(){
      this.callParent( arguments );
      console.log( 'new ' + this.self.getName());
      this.control({
         '#ProspectsTableNonLues'  : { selectionchange : this.onNonLuesSelectionChanged },
         ...
         '#savePairsButton'        : { click           : this.onSavePairs               },
         ...
         '#mail'                   : { click           : this.onMail                    },
});
   }
});

まだ何も表示されていません!

私の質問は、データをストアからビューにフィードするように変換するにはどうすればよいですか?

4

2 に答える 2

0

サーバーへの二重リクエストやその他の理由を避けるために、複数のビュー間でストアのインスタンスを共有することを好みます。

Prasad Kが指摘したように、nameとの間の間違いはid修正する必要があります。

Sencha Extjs4.2.2のドキュメントで指摘されているように、ストアがコントローラーによってインスタンス化されると、id が設定されていても、id はそのクラスの名前になります (バグ?)。

したがって、コードは次のようになります。

Ext.define( 'LFinanceCRM.view.RawDataView', {
   extend      : 'Ext.grid.Panel',
   alias       : 'widget.raw-data-view',
   autoScroll  : true,
   title       : 'Données brutes',
   columnLines : true,
   viewConfig  : { stripeRows : true },
   store       : 'Prospect',
   columns     : [{
      text      : 'Nom',
      dataIndex : 'id',
      sortable  : false,
      width     : '29%'
   },{
      text      : 'Valeur',
      dataIndex : 'value',
      sortable  : true,
      width     : '70%'
   }],
   constructor : function() {
      this.callParent( arguments );
      console.log('new ' + this.self.getName());
   }
});

そしてそれはうまくいきます!

于 2013-11-02T17:29:22.353 に答える