DataWriter.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:7k
源码类别:

中间件编程

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.0.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. /**
  8.  * @class Ext.data.DataWriter
  9.  * <p>Ext.data.DataWriter facilitates create, update, and destroy actions between
  10.  * an Ext.data.Store and a server-side framework. A Writer enabled Store will
  11.  * automatically manage the Ajax requests to perform CRUD actions on a Store.</p>
  12.  * <p>Ext.data.DataWriter is an abstract base class which is intended to be extended
  13.  * and should not be created directly. For existing implementations, see
  14.  * {@link Ext.data.JsonWriter}.</p>
  15.  * <p>Creating a writer is simple:</p>
  16.  * <pre><code>
  17. var writer = new Ext.data.JsonWriter();
  18.  * </code></pre>
  19.  * <p>The proxy for a writer enabled store can be configured with a simple <code>url</code>:</p>
  20.  * <pre><code>
  21. // Create a standard HttpProxy instance.
  22. var proxy = new Ext.data.HttpProxy({
  23.     url: 'app.php/users'
  24. });
  25.  * </code></pre>
  26.  * <p>For finer grained control, the proxy may also be configured with an <code>api</code>:</p>
  27.  * <pre><code>
  28. // Use the api specification
  29. var proxy = new Ext.data.HttpProxy({
  30.     api: {
  31.         read    : 'app.php/users/read',
  32.         create  : 'app.php/users/create',
  33.         update  : 'app.php/users/update',
  34.         destroy : 'app.php/users/destroy'
  35.     }
  36. });
  37.  * </code></pre>
  38.  * <p>Creating a Writer enabled store:</p>
  39.  * <pre><code>
  40. var store = new Ext.data.Store({
  41.     proxy: proxy,
  42.     reader: reader,
  43.     writer: writer
  44. });
  45.  * </code></pre>
  46.  * @constructor Create a new DataWriter
  47.  * @param {Object} meta Metadata configuration options (implementation-specific)
  48.  * @param {Object} recordType Either an Array of field definition objects as specified
  49.  * in {@link Ext.data.Record#create}, or an {@link Ext.data.Record} object created
  50.  * using {@link Ext.data.Record#create}.
  51.  */
  52. Ext.data.DataWriter = function(config){
  53.     /**
  54.      * This DataWriter's configured metadata as passed to the constructor.
  55.      * @type Mixed
  56.      * @property meta
  57.      */
  58.     Ext.apply(this, config);
  59. };
  60. Ext.data.DataWriter.prototype = {
  61.     /**
  62.      * @cfg {Boolean} writeAllFields
  63.      * <tt>false</tt> by default.  Set <tt>true</tt> to have DataWriter return ALL fields of a modified
  64.      * record -- not just those that changed.
  65.      * <tt>false</tt> to have DataWriter only request modified fields from a record.
  66.      */
  67.     writeAllFields : false,
  68.     /**
  69.      * @cfg {Boolean} listful
  70.      * <tt>false</tt> by default.  Set <tt>true</tt> to have the DataWriter <b>always</b> write HTTP params as a list,
  71.      * even when acting upon a single record.
  72.      */
  73.     listful : false,    // <-- listful is actually not used internally here in DataWriter.  @see Ext.data.Store#execute.
  74.     /**
  75.      * Writes data in preparation for server-write action.  Simply proxies to DataWriter#update, DataWriter#create
  76.      * DataWriter#destroy.
  77.      * @param {String} action [CREATE|UPDATE|DESTROY]
  78.      * @param {Object} params The params-hash to write-to
  79.      * @param {Record/Record[]} rs The recordset write.
  80.      */
  81.     write : function(action, params, rs) {
  82.         this.render(action, rs, params, this[action](rs));
  83.     },
  84.     /**
  85.      * abstract method meant to be overridden by all DataWriter extensions.  It's the extension's job to apply the "data" to the "params".
  86.      * The data-object provided to render is populated with data according to the meta-info defined in the user's DataReader config,
  87.      * @param {String} action [Ext.data.Api.actions.create|read|update|destroy]
  88.      * @param {Record[]} rs Store recordset
  89.      * @param {Object} params Http params to be sent to server.
  90.      * @param {Object} data object populated according to DataReader meta-data.
  91.      */
  92.     render : Ext.emptyFn,
  93.     /**
  94.      * update
  95.      * @param {Object} p Params-hash to apply result to.
  96.      * @param {Record/Record[]} rs Record(s) to write
  97.      * @private
  98.      */
  99.     update : function(rs) {
  100.         var params = {};
  101.         if (Ext.isArray(rs)) {
  102.             var data = [],
  103.                 ids = [];
  104.             Ext.each(rs, function(val){
  105.                 ids.push(val.id);
  106.                 data.push(this.updateRecord(val));
  107.             }, this);
  108.             params[this.meta.idProperty] = ids;
  109.             params[this.meta.root] = data;
  110.         }
  111.         else if (rs instanceof Ext.data.Record) {
  112.             params[this.meta.idProperty] = rs.id;
  113.             params[this.meta.root] = this.updateRecord(rs);
  114.         }
  115.         return params;
  116.     },
  117.     /**
  118.      * @cfg {Function} saveRecord Abstract method that should be implemented in all subclasses
  119.      * (e.g.: {@link Ext.data.JsonWriter#saveRecord JsonWriter.saveRecord}
  120.      */
  121.     updateRecord : Ext.emptyFn,
  122.     /**
  123.      * create
  124.      * @param {Object} p Params-hash to apply result to.
  125.      * @param {Record/Record[]} rs Record(s) to write
  126.      * @private
  127.      */
  128.     create : function(rs) {
  129.         var params = {};
  130.         if (Ext.isArray(rs)) {
  131.             var data = [];
  132.             Ext.each(rs, function(val){
  133.                 data.push(this.createRecord(val));
  134.             }, this);
  135.             params[this.meta.root] = data;
  136.         }
  137.         else if (rs instanceof Ext.data.Record) {
  138.             params[this.meta.root] = this.createRecord(rs);
  139.         }
  140.         return params;
  141.     },
  142.     /**
  143.      * @cfg {Function} createRecord Abstract method that should be implemented in all subclasses
  144.      * (e.g.: {@link Ext.data.JsonWriter#createRecord JsonWriter.createRecord})
  145.      */
  146.     createRecord : Ext.emptyFn,
  147.     /**
  148.      * destroy
  149.      * @param {Object} p Params-hash to apply result to.
  150.      * @param {Record/Record[]} rs Record(s) to write
  151.      * @private
  152.      */
  153.     destroy : function(rs) {
  154.         var params = {};
  155.         if (Ext.isArray(rs)) {
  156.             var data = [],
  157.                 ids = [];
  158.             Ext.each(rs, function(val){
  159.                 data.push(this.destroyRecord(val));
  160.             }, this);
  161.             params[this.meta.root] = data;
  162.         } else if (rs instanceof Ext.data.Record) {
  163.             params[this.meta.root] = this.destroyRecord(rs);
  164.         }
  165.         return params;
  166.     },
  167.     /**
  168.      * @cfg {Function} destroyRecord Abstract method that should be implemented in all subclasses
  169.      * (e.g.: {@link Ext.data.JsonWriter#destroyRecord JsonWriter.destroyRecord})
  170.      */
  171.     destroyRecord : Ext.emptyFn,
  172.     /**
  173.      * Converts a Record to a hash
  174.      * @param {Record}
  175.      * @private
  176.      */
  177.     toHash : function(rec) {
  178.         var map = rec.fields.map,
  179.             data = {},
  180.             raw = (this.writeAllFields === false && rec.phantom === false) ? rec.getChanges() : rec.data,
  181.             m;
  182.         Ext.iterate(raw, function(prop, value){
  183.             if((m = map[prop])){
  184.                 data[m.mapping ? m.mapping : m.name] = value;
  185.             }
  186.         });
  187.         data[this.meta.idProperty] = rec.id;
  188.         return data;
  189.     }
  190. };