X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/c930e9176a5a85509c5b0230e2bff5c22a591432..7a654f8d43fdb43d78b63d90528bed6e86b608cc:/docs/api/Ext.data.Model.html diff --git a/docs/api/Ext.data.Model.html b/docs/api/Ext.data.Model.html new file mode 100644 index 00000000..aa060633 --- /dev/null +++ b/docs/api/Ext.data.Model.html @@ -0,0 +1,858 @@ +
Mixins
A Model represents some object that your application manages. For example, one might define a Model for Users, Products, +Cars, or any other real-world object that we want to model in the system. Models are registered via the model manager, +and are used by stores, which are in turn used by many of the data-bound components in Ext.
+ + + + +Models are defined as a set of fields and any arbitrary methods and properties relevant to the model. For example:
+ + + + +Ext.define('User', {
+ extend: 'Ext.data.Model',
+ fields: [
+ {name: 'name', type: 'string'},
+ {name: 'age', type: 'int'},
+ {name: 'phone', type: 'string'},
+ {name: 'alive', type: 'boolean', defaultValue: true}
+ ],
+
+ changeName: function() {
+ var oldName = this.get('name'),
+ newName = oldName + " The Barbarian";
+
+ this.set('name', newName);
+ }
+});
+
+
+
+
+
+The fields array is turned into a MixedCollection automatically by the ModelManager, and all +other functions and properties are copied to the new Model's prototype.
+ + + + +Now we can create instances of our User model and call any model logic we defined:
+ + + + +var user = Ext.ModelManager.create({
+ name : 'Conan',
+ age : 24,
+ phone: '555-555-5555'
+}, 'User');
+
+user.changeName();
+user.get('name'); //returns "Conan The Barbarian"
+
+
+
+
+
+Validations
+ + + + +Models have built-in support for validations, which are executed against the validator functions in +Ext.data.validations (see all validation functions). Validations are easy to add to models:
+ + + + +Ext.define('User', {
+ extend: 'Ext.data.Model',
+ fields: [
+ {name: 'name', type: 'string'},
+ {name: 'age', type: 'int'},
+ {name: 'phone', type: 'string'},
+ {name: 'gender', type: 'string'},
+ {name: 'username', type: 'string'},
+ {name: 'alive', type: 'boolean', defaultValue: true}
+ ],
+
+ validations: [
+ {type: 'presence', field: 'age'},
+ {type: 'length', field: 'name', min: 2},
+ {type: 'inclusion', field: 'gender', list: ['Male', 'Female']},
+ {type: 'exclusion', field: 'username', list: ['Admin', 'Operator']},
+ {type: 'format', field: 'username', matcher: /([a-z]+)[0-9]{2,3}/}
+ ]
+});
+
+
+
+
+
+The validations can be run by simply calling the validate function, which returns a Ext.data.Errors +object:
+ + + + +var instance = Ext.ModelManager.create({
+ name: 'Ed',
+ gender: 'Male',
+ username: 'edspencer'
+}, 'User');
+
+var errors = instance.validate();
+
+
+
+
+
+Associations
+ + + + +Models can have associations with other Models via belongsTo and +hasMany associations. For example, let's say we're writing a blog administration +application which deals with Users, Posts and Comments. We can express the relationships between these models like this:
+ + + + +Ext.define('Post', {
+ extend: 'Ext.data.Model',
+ fields: ['id', 'user_id'],
+
+ belongsTo: 'User',
+ hasMany : {model: 'Comment', name: 'comments'}
+});
+
+Ext.define('Comment', {
+ extend: 'Ext.data.Model',
+ fields: ['id', 'user_id', 'post_id'],
+
+ belongsTo: 'Post'
+});
+
+Ext.define('User', {
+ extend: 'Ext.data.Model',
+ fields: ['id'],
+
+ hasMany: [
+ 'Post',
+ {model: 'Comment', name: 'comments'}
+ ]
+});
+
+
+
+
+
+See the docs for Ext.data.BelongsToAssociation and Ext.data.HasManyAssociation for details on the usage +and configuration of associations. Note that associations can also be specified like this:
+ + + + +Ext.define('User', {
+ extend: 'Ext.data.Model',
+ fields: ['id'],
+
+ associations: [
+ {type: 'hasMany', model: 'Post', name: 'posts'},
+ {type: 'hasMany', model: 'Comment', name: 'comments'}
+ ]
+});
+
+
+
+
+
+Using a Proxy
+ + + + +Models are great for representing types of data and relationships, but sooner or later we're going to want to +load or save that data somewhere. All loading and saving of data is handled via a Proxy, +which can be set directly on the Model:
+ + + + +Ext.define('User', {
+ extend: 'Ext.data.Model',
+ fields: ['id', 'name', 'email'],
+
+ proxy: {
+ type: 'rest',
+ url : '/users'
+ }
+});
+
+
+
+
+
+Here we've set up a Rest Proxy, which knows how to load and save data to and from a +RESTful backend. Let's see how this works:
+ + + + +var user = Ext.ModelManager.create({name: 'Ed Spencer', email: 'ed@sencha.com'}, 'User');
+
+user.save(); //POST /users
+
+
+
+
+
+Calling save on the new Model instance tells the configured RestProxy that we wish to persist this +Model's data onto our server. RestProxy figures out that this Model hasn't been saved before because it doesn't +have an id, and performs the appropriate action - in this case issuing a POST request to the url we configured +(/users). We configure any Proxy on any Model and always follow this API - see Ext.data.proxy.Proxy for a full +list.
+ + + + +Loading data via the Proxy is equally easy:
+ + + + +//get a reference to the User model class
+var User = Ext.ModelManager.getModel('User');
+
+//Uses the configured RestProxy to make a GET request to /users/123
+User.load(123, {
+ success: function(user) {
+ console.log(user.getId()); //logs 123
+ }
+});
+
+
+
+
+
+Models can also be updated and destroyed easily:
+ + + + +//the user Model we loaded in the last snippet:
+user.set('name', 'Edward Spencer');
+
+//tells the Proxy to save the Model. In this case it will perform a PUT request to /users/123 as this Model already has an id
+user.save({
+ success: function() {
+ console.log('The User was updated');
+ }
+});
+
+//tells the Proxy to destroy the Model. Performs a DELETE request to /users/123
+user.destroy({
+ success: function() {
+ console.log('The User was destroyed!');
+ }
+});
+
+
+
+
+
+Usage in Stores
+ + + + +It is very common to want to load a set of Model instances to be displayed and manipulated in the UI. We do this +by creating a Store:
+ + + + +var store = new Ext.data.Store({
+ model: 'User'
+});
+
+//uses the Proxy we set up on Model to load the Store data
+store.load();
+
+
+
+
+
+A Store is just a collection of Model instances - usually loaded from a server somewhere. Store can also maintain +a set of added, updated and removed Model instances to be synchronized with the server via the Proxy. See the +Store docs for more information on Stores.
+ +The name of the field treated as this Model's unique id (defaults to 'id').
+The name of the field treated as this Model's unique id (defaults to 'id').
+(optional)
A config object containing one or more event handlers to be added to this +object during initialization. This should be a valid listeners config object as specified in the +addListener example for attaching multiple handlers at once.
+ +DOM events from ExtJs Components
+ + +While some ExtJs Component classes export selected DOM events (e.g. "click", "mouseover" etc), this + + +
is usually only done when extra value can be added. For example the DataView's
+click
event passing the node clicked on. To access DOM
+events directly from a child element of a Component, we need to specify the element
option to
+identify the Component property to add a DOM listener to:
new Ext.panel.Panel({
+ width: 400,
+ height: 200,
+ dockedItems: [{
+ xtype: 'toolbar'
+ }],
+ listeners: {
+ click: {
+ element: 'el', //bind to the underlying el property on the panel
+ fn: function(){ console.log('click el'); }
+ },
+ dblclick: {
+ element: 'body', //bind to the underlying body property on the panel
+ fn: function(){ console.log('dblclick body'); }
+ }
+ }
+});
+
+
+
+
+The string type of the default Model Proxy. Defaults to 'ajax'
+The string type of the default Model Proxy. Defaults to 'ajax'
+Readonly flag - true if this Record has been modified.
+Readonly flag - true if this Record has been modified.
+Internal flag used to track whether or not the model instance is currently being edited. Read-only
+Internal flag used to track whether or not the model instance is currently being edited. Read-only
+Key: value pairs of all fields whose values have changed
+Key: value pairs of all fields whose values have changed
+true when the record does not yet exist in a server-side database (see +setDirty). Any record which has a real database pk set as its id property +is NOT a phantom -- it's real.
+The Ext.data.Store to which this Record belongs.
+The Ext.data.Store to which this Record belongs.
+
An object containing keys corresponding to this model's fields, and their associated values
+Optional unique ID to assign to this model instance
+Adds the specified events to the list of events which this Observable may fire.
+Adds the specified events to the list of events which this Observable may fire.
+Either an object with event names as properties with a value of true
+or the first event name string if multiple event names are being passed as separate parameters.
[additional] Optional additional event names if multiple event names are being passed as separate parameters. +Usage:
+ +this.addEvents('storeloaded', 'storecleared');
+
+
+Appends an event handler to this object.
+Appends an event handler to this object.
+The name of the event to listen for. May also be an object who's property names are event names. See
+The method the event invokes.
+(optional) The scope (this
reference) in which the handler function is executed.
+If omitted, defaults to the object which fired the event.
(optional) An object containing handler configuration. +properties. This may contain any of the following properties:
this
reference) in which the handler function is executed.
+If omitted, defaults to the object which fired the event.This option is useful during Component construction to add DOM event listeners to elements of Components which +will exist only after the Component is rendered. For example, to add a click listener to a Panel's body: +
new Ext.panel.Panel({
+ title: 'The title',
+ listeners: {
+ click: this.handlePanelClick,
+ element: 'body'
+ }
+});
+
+
+
+When added in this way, the options available are the options applicable to Ext.core.Element.addListener
+ + +
+Combining Options
+Using the options argument, it is possible to combine different types of listeners:
+
+A delayed, one-time listener.
+
myPanel.on('hide', this.handleClick, this, {
+single: true,
+delay: 100
+});
+
+Attaching multiple handlers in 1 call
+The method also allows for a single argument to be passed which is a config object containing properties
+which specify multiple events. For example:
+
myGridPanel.on({
+ cellClick: this.onCellClick,
+ mouseover: this.onMouseOver,
+ mouseout: this.onMouseOut,
+ scope: this // Important. Ensure "this" is correct during handler execution
+});
+
.
++ +
Adds listeners to any Observable object (or Element) which are automatically removed when this Component +is destroyed. + +
Adds listeners to any Observable object (or Element) which are automatically removed when this Component +is destroyed. + +
The item to which to add a listener/listeners.
+The event name, or an object containing event name properties.
+Optional. If the ename
parameter was an event name, this
+is the handler function.
Optional. If the ename
parameter was an event name, this
+is the scope (this
reference) in which the handler function is executed.
Optional. If the ename
parameter was an event name, this
+is the addListener options.
Begin an edit. While in edit mode, no events (e.g.. the update
event)
+are relayed to the containing store. When an edit has begun, it must be followed
+by either endEdit or cancelEdit.
Cancels all changes made in the current edit operation.
+Cancels all changes made in the current edit operation.
+Starts capture on the specified Observable. All events will be passed +to the supplied function with the event name + standard signature of the event +before the event is fired. If the supplied function returns false, +the event will not fire.
+The Observable to capture events from.
+The function to call when an event is fired.
+(optional) The scope (this
reference) in which the function is executed. Defaults to the Observable firing the event.
Removes all listeners for this object including the managed listeners
+Removes all listeners for this object including the managed listeners
+Removes all managed listeners for this object.
+Removes all managed listeners for this object.
+Usually called by the Ext.data.Store which owns the model instance. +Commits all changes made to the instance since either creation or the last commit operation.
+ +Developers should subscribe to the Ext.data.Store.update event +to have their code notified of commit operations.
+ +(optional) True to skip notification of the owning +store of the change (defaults to false)
+Creates a copy (clone) of this Model instance.
+Creates a copy (clone) of this Model instance.
+(optional) A new id, defaults to the id
+of the instance being copied. See id
.
+To generate a phantom instance with a new id use:
var rec = record.copy(); // clone the record
+Ext.data.Model.id(rec); // automatically generate a unique sequential id
+
+
+Destroys the model using the configured proxy
+Destroys the model using the configured proxy
+Options to pass to the proxy
+The Model instance
+Enables events fired by this Observable to bubble up an owner hierarchy by calling
+this.getBubbleTarget()
if present. There is no implementation in the Observable base class.
This is commonly used by Ext.Components to bubble events to owner Containers. See Ext.Component.getBubbleTarget. The default +implementation in Ext.Component returns the Component's immediate owner. But if a known target is required, this can be overridden to +access the required target more quickly.
+ + +Example:
+ + +Ext.override(Ext.form.field.Base, {
+// Add functionality to Field's initComponent to enable the change event to bubble
+initComponent : Ext.Function.createSequence(Ext.form.field.Base.prototype.initComponent, function() {
+ this.enableBubble('change');
+}),
+
+// We know that we want Field's events to bubble directly to the FormPanel.
+getBubbleTarget : function() {
+ if (!this.formPanel) {
+ this.formPanel = this.findParentByType('form');
+ }
+ return this.formPanel;
+}
+});
+
+var myForm = new Ext.formPanel({
+title: 'User Details',
+items: [{
+ ...
+}],
+listeners: {
+ change: function() {
+ // Title goes red if form has been modified.
+ myForm.header.setStyle('color', 'red');
+ }
+}
+});
+
+
+The event name to bubble, or an Array of event names.
+End an edit. If any data was modified, the containing store is notified
+(ie, the store's update
event will fire).
End an edit. If any data was modified, the containing store is notified
+(ie, the store's update
event will fire).
True to not notify the store of the change
+Fires the specified event with the passed parameters (minus the event name).
+ + +An event may be set to bubble up an Observable parent hierarchy (See Ext.Component.getBubbleTarget) +by calling enableBubble.
+ +The name of the event to fire.
+Variable number of parameters are passed to handlers.
+returns false if any of the handlers return false otherwise it returns true.
+Returns the value of the given field
+Returns the value of the given field
+The field to fetch the value for
+The value
+Gets all of the data from this Models loaded associations. +It does this recursively - for example if we have a User which +hasMany Orders, and each Order hasMany OrderItems, it will return an object like this: +{
+ +orders: [
+ {
+ id: 123,
+ status: 'shipped',
+ orderItems: [
+ ...
+ ]
+ }
+]
+
+
+}
+The nested data set for the Model's loaded associations
+Gets a hash of only the fields that have been modified since this Model was created or commited.
+Gets a hash of only the fields that have been modified since this Model was created or commited.
+Object
+Returns the unique ID allocated to this model instance as defined by idProperty
+Returns the unique ID allocated to this model instance as defined by idProperty
+The id
+Returns the configured Proxy for this Model
+Returns the configured Proxy for this Model
+The proxy
+Checks to see if this object has any listeners for a specified event
+Checks to see if this object has any listeners for a specified event
+The name of the event to check for
+True if the event is being listened for, else false
+Generates a sequential id. This method is typically called when a record is created +and no id has been specified. The id will automatically be assigned +to the record. The returned id takes the form: +{PREFIX}-{AUTO_ID}.
Ext.data.Model.PREFIX +(defaults to 'ext-record')
Ext.data.Model.AUTO_ID +(defaults to 1 initially)
The record being created. The record does not exist, it's a phantom.
+auto-generated string id, "ext-record-i++';
+Tells this model instance that it has been added to a store
+Tells this model instance that it has been added to a store
+The store that the model has been added to
+Static. Asynchronously loads a model instance by id. Sample usage:
+ + MyApp.User = Ext.define('User', {
+ extend: 'Ext.data.Model',
+ fields: [
+ {name: 'id', type: 'int'},
+ {name: 'name', type: 'string'}
+ ]
+ });
+
+ MyApp.User.load(10, {
+ scope: this,
+ failure: function(record, operation) {
+ //do something if the load failed
+ },
+ success: function(record, operation) {
+ //do something if the load succeeded
+ },
+ callback: function(record, operation) {
+ //do something whether the load succeeded or failed
+ }
+ });
+
+
+The id of the model to load
+Optional config object containing success, failure and callback functions, plus optional scope
+Sets observability on the passed class constructor.
+ +This makes any event fired on any instance of the passed class also fire a single event through +the class allowing for central handling of events on many instances at once.
+ +Usage:
+ +Ext.util.Observable.observe(Ext.data.Connection);
+Ext.data.Connection.on('beforerequest', function(con, options) {
+ console.log('Ajax request made to ' + options.url);
+});
+
+The class constructor to make observable.
+An object containing a series of listeners to add. See addListener.
+Appends an event handler to this object (shorthand for addListener.)
+Appends an event handler to this object (shorthand for addListener.)
+The type of event to listen for
+The method the event invokes
+(optional) The scope (this
reference) in which the handler function is executed.
+If omitted, defaults to the object which fired the event.
(optional) An object containing handler configuration.
+Usually called by the Ext.data.Store to which this model instance has been joined. +Rejects all changes made to the model instance since either creation, or the last commit operation. +Modified fields are reverted to their original values.
+ +Developers should subscribe to the Ext.data.Store.update event +to have their code notified of reject operations.
+ +(optional) True to skip notification of the owning +store of the change (defaults to false)
+Relays selected events from the specified Observable as if the events were fired by this
.
Relays selected events from the specified Observable as if the events were fired by this
.
The Observable whose events this object is to relay.
+Array of event names to relay.
+Removes all added captures from the Observable.
+Removes all added captures from the Observable.
+The Observable to release
+Removes an event handler.
+Removes an event handler.
+The type of event the handler was associated with.
+The handler to remove. This must be a reference to the function passed into the addListener call.
+(optional) The scope originally specified for the handler.
+Removes listeners that were added by the mon method.
+Removes listeners that were added by the mon method.
+The item from which to remove a listener/listeners.
+The event name, or an object containing event name properties.
+Optional. If the ename
parameter was an event name, this
+is the handler function.
Optional. If the ename
parameter was an event name, this
+is the scope (this
reference) in which the handler function is executed.
Resume firing events. (see suspendEvents)
+If events were suspended using the queueSuspended
parameter, then all
+events fired during event suspension will be sent to any listeners now.
Saves the model instance using the configured proxy
+Saves the model instance using the configured proxy
+Options to pass to the proxy
+The Model instance
+Sets the given field to the given value, marks the instance as dirty
+Sets the given field to the given value, marks the instance as dirty
+The field to set, or an object containing key/value pairs
+The value to set
+Marks this Record as dirty
. This method
+is used interally when adding phantom
records to a
+writer enabled store.
Marking a record dirty
causes the phantom to
+
+
+
be returned by Ext.data.Store.getModifiedRecords where it will +have a create action composed for it during store save +operations.
+Sets the model instance's id field to the given id
+Sets the model instance's id field to the given id
+The new id
+Sets the Proxy to use for this model. Accepts any options that can be accepted by Ext.createByAlias
+Sets the Proxy to use for this model. Accepts any options that can be accepted by Ext.createByAlias
+The proxy
+Suspend the firing of all events. (see resumeEvents)
+Suspend the firing of all events. (see resumeEvents)
+Pass as true to queue up suspended events to be fired +after the resumeEvents call instead of discarding all suspended events;
+Removes an event handler (shorthand for removeListener.)
+Removes an event handler (shorthand for removeListener.)
+The type of event the handler was associated with.
+The handler to remove. This must be a reference to the function passed into the addListener call.
+(optional) The scope originally specified for the handler.
+Tells this model instance that it has been removed from the store
+Tells this model instance that it has been removed from the store
+Validates the current data against all of its configured validations and returns an +Errors object
+Validates the current data against all of its configured validations and returns an +Errors object
+The errors object
+