Data Binding Example - Implemented with classes : GridPanel « Ext JS « JavaScript DHTML






Data Binding Example - Implemented with classes

   

<!--
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.com
 * http://www.extjs.com/license
 */
-->
<html>
<head>
<title>Hello World Window</title>
<link rel="stylesheet" type="text/css" href="ext-3.0.0/resources/css/ext-all.css" />
<script type="text/javascript" src="ext-3.0.0/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="ext-3.0.0/ext-all.js"></script>

</head>

<!-- Revised from demo code in ext3.0.0 -->
<body>
<script type="text/javascript">
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.com
 * http://www.extjs.com/license
 */
// setup an App namespace
// This is done to prevent collisions in the global namespace
Ext.ns('App');

/**
 * App.BookStore
 * @extends Ext.data.Store
 * @cfg {String} url This will be a url of a location to load the BookStore
 * This is a specialized Store which maintains books.
 * It already knows about Amazon's XML definition and will expose the following
 * Record defintion:
 *  - Author
 *  - Manufacturer
 *  - ProductGroup
 *  - DetailPageURL
 */
App.BookStore = function(config) {
  var config = config || {};
  Ext.applyIf(config, {
    reader: new Ext.data.XmlReader({
           // records will have an "Item" tag
           record: 'Item',
           id: 'ASIN',
           totalRecords: '@total'
       }, [
           // set up the fields mapping into the xml doc
           // The first needs mapping, the others are very basic
           {name: 'Author', mapping: 'ItemAttributes > Author'},
           'Title',
       'Manufacturer',
       'ProductGroup',
       // Detail URL is not part of the column model of the grid
       'DetailPageURL'
       ])
  });
  // call the superclass's constructor
  App.BookStore.superclass.constructor.call(this, config);
};
Ext.extend(App.BookStore, Ext.data.Store);



/**
 * App.BookGrid
 * @extends Ext.grid.GridPanel
 * This is a custom grid which will display book information. It is tied to
 * a specific record definition by the dataIndex properties.
 *
 * It follows a very custom pattern used only when extending Ext.Components
 * in which you can omit the constructor.
 *
 * It also registers the class with the Component Manager with an xtype of
 * bookgrid. This allows the application to take care of the lazy-instatiation
 * facilities provided in Ext's Component Model.
 */
App.BookGrid = Ext.extend(Ext.grid.GridPanel, {
  // override
  initComponent : function() {
    Ext.apply(this, {
      // Pass in a column model definition
      // Note that the DetailPageURL was defined in the record definition but is not used
      // here. That is okay.
          columns: [
              {header: "Author", width: 120, dataIndex: 'Author', sortable: true},
              {header: "Title", dataIndex: 'Title', sortable: true},
              {header: "Manufacturer", width: 115, dataIndex: 'Manufacturer', sortable: true},
              {header: "Product Group", dataIndex: 'ProductGroup', sortable: true}
          ],
      sm: new Ext.grid.RowSelectionModel({singleSelect: true}),
      // Note the use of a storeId, this will register thisStore
      // with the StoreMgr and allow us to retrieve it very easily.
      store: new App.BookStore({
        storeId: 'gridBookStore',
        url: 'ext-3.0.0/examples/grid/sheldon.xml'
      }),
      // force the grid to fit the space which is available
      viewConfig: {
        forceFit: true
      }
    });
    // finally call the superclasses implementation
    App.BookGrid.superclass.initComponent.call(this);
  }
});
// This will associate an string representation of a class
// (called an xtype) with the Component Manager
// It allows you to support lazy instantiation of your components
Ext.reg('bookgrid', App.BookGrid);


/**
 * App.BookDetail
 * @extends Ext.Panel
 * This is a specialized Panel which is used to show information about
 * a book.
 *
 * This demonstrates adding 2 custom properties (tplMarkup and
 * startingMarkup) to the class. It also overrides the initComponent
 * method and adds a new method called updateDetail.
 *
 * The class will be registered with an xtype of 'bookdetail'
 */
App.BookDetail = Ext.extend(Ext.Panel, {
  // add tplMarkup as a new property
  tplMarkup: [
    'Title: <a href="{DetailPageURL}" target="_blank">{Title}</a><br/>',
    'Author: {Author}<br/>',
    'Manufacturer: {Manufacturer}<br/>',
    'Product Group: {ProductGroup}<br/>'
  ],
  // startingMarup as a new property
  startingMarkup: 'Please select a book to see additional details',
  // override initComponent to create and compile the template
  // apply styles to the body of the panel and initialize
  // html to startingMarkup
  initComponent: function() {
    this.tpl = new Ext.Template(this.tplMarkup);
    Ext.apply(this, {
      bodyStyle: {
        background: '#ffffff',
        padding: '7px'
      },
      html: this.startingMarkup
    });
    // call the superclass's initComponent implementation
    App.BookDetail.superclass.initComponent.call(this);
  },
  // add a method which updates the details
  updateDetail: function(data) {
    this.tpl.overwrite(this.body, data);
  }
});
// register the App.BookDetail class with an xtype of bookdetail
Ext.reg('bookdetail', App.BookDetail);


/**
 * App.BookMasterDetail
 * @extends Ext.Panel
 *
 * This is a specialized panel which is composed of both a bookgrid
 * and a bookdetail panel. It provides the glue between the two
 * components to allow them to communicate. You could consider this
 * the actual application.
 *
 */
App.BookMasterDetail = Ext.extend(Ext.Panel, {
  // override initComponent
  initComponent: function() {
    // used applyIf rather than apply so user could
    // override the defaults
    Ext.applyIf(this, {
      frame: true,
      title: 'Book List',
      width: 540,
      height: 400,
      layout: 'border',
      items: [{
        xtype: 'bookgrid',
        itemId: 'gridPanel',
        region: 'north',
        height: 210,
        split: true
      },{
        xtype: 'bookdetail',
        itemId: 'detailPanel',
        region: 'center'
      }]
    })
    // call the superclass's initComponent implementation
    App.BookMasterDetail.superclass.initComponent.call(this);
  },
  // override initEvents
  initEvents: function() {
    // call the superclass's initEvents implementation
    App.BookMasterDetail.superclass.initEvents.call(this);

    // now add application specific events
    // notice we use the selectionmodel's rowselect event rather
    // than a click event from the grid to provide key navigation
    // as well as mouse navigation
    var bookGridSm = this.getComponent('gridPanel').getSelectionModel();
    bookGridSm.on('rowselect', this.onRowSelect, this);
  },
  // add a method called onRowSelect
  // This matches the method signature as defined by the 'rowselect'
  // event defined in Ext.grid.RowSelectionModel
  onRowSelect: function(sm, rowIdx, r) {
    // getComponent will retrieve itemId's or id's. Note that itemId's
    // are scoped locally to this instance of a component to avoid
    // conflicts with the ComponentMgr
    var detailPanel = this.getComponent('detailPanel');
    detailPanel.updateDetail(r.data);
  }
});
// register an xtype with this class
Ext.reg('bookmasterdetail', App.BookMasterDetail);


// Finally now that we've defined all of our classes we can instantiate
// an instance of the app and renderTo an existing div called 'binding-example'
// Note now that classes have encapsulated this behavior we can easily create
// an instance of this app to be used in many different contexts, you could
// easily place this application in an Ext.Window for example
Ext.onReady(function() {
  // create an instance of the app
  var bookApp = new App.BookMasterDetail({
    renderTo: 'binding-example'
  });
  // We can retrieve a reference to the data store
  // via the StoreMgr by its storeId
  Ext.StoreMgr.get('gridBookStore').load();
});</script> 

<div id="binding-example"></div>
</body>
</html>

   
    
    
  








Related examples in the same category

1.Sort table by name
2.Add row to a table
3.Remove a row from a table
4.Remove all data from GridPanel
5.Layout GridPanel(table) and FormPanel in border layout
6.Using a Grid with a Form
7.Table Selection
8.The Grid demonstrates the use of creation of derived fields in a Record created using a custom convert function, and the use of column renderers.
9.Set column name, width, height, title for Ext.grid.GridPanel
10.Set column to sortable
11.Add rowselect event handler to a GridPanel
12.GridPanel: framing
13.GridPanel: buttons
14.GridPanel: toolbars
15.Add buttons to GridPanel
16.Static data grid
17.Reload data to GridPanel
18.Grid Plugins
19.stripeRows: true,
20.Grouping GridPanel
21.Buffer Grid Example
22.GridPanel Framed with Checkbox Selection and Horizontal Scrolling
23.Grid with Numbered Rows and Force Fit
24.Set autoExpandColumn for GridPanel
25.autoExpandColumn: 'column name',
26.Set up data, column for Ext.grid.GridPanel
27.Set RowSelectionModel for Ext.grid.GridPanel
28.Mark changed field
29.Updating the grid data via a button click
30.Define RowSelectionModel and set single selection
31.Define column model and set header, dataIndex and sortable
32.Create a grid with from an existing, unformatted HTML table.