src/cm/media/js/lib/yui/yui_3.10.3/docs/model/index.html
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 525 89ef5ed3c48b
permissions -rw-r--r--
add link to "privacy policy" in the header test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
525
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     1
<!DOCTYPE html>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     2
<html lang="en">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     3
<head>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     4
    <meta charset="utf-8">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     5
    <title>Model</title>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     6
    <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=PT+Sans:400,700,400italic,700italic">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     7
    <link rel="stylesheet" href="../../build/cssgrids/cssgrids-min.css">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     8
    <link rel="stylesheet" href="../assets/css/main.css">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     9
    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    10
    <link rel="shortcut icon" type="image/png" href="../assets/favicon.png">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    11
    <script src="../../build/yui/yui-min.js"></script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    12
    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    13
</head>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    14
<body>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    15
<!--
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    16
<a href="https://github.com/yui/yui3"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub"></a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    17
-->
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    18
<div id="doc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    19
    <div id="hd">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    20
        <h1><img src="http://yuilibrary.com/img/yui-logo.png"></h1>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    21
    </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    22
    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    23
        <a href="#toc" class="jump">Jump to Table of Contents</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    24
    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    25
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    26
            <h1>Model</h1>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    27
    <div class="yui3-g">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    28
        <div class="yui3-u-3-4">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    29
            <div id="main">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    30
                <div class="content"><div class="intro">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    31
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    32
Model is a lightweight <a href="../attribute/index.html">Attribute</a>-based data model with methods for getting, setting, validating, and syncing attribute values to a persistence layer or server, as well as events for notifying listeners of model changes.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    33
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    34
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    35
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    36
The <code>Y.Model</code> class is intended to be extended by a custom class that defines
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    37
custom model attributes, validators, and behaviors.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    38
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    39
</div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    40
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    41
<h2 id="getting-started">Getting Started</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    42
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    43
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    44
To include the source files for Model and its dependencies, first load
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    45
the YUI seed file if you haven't already loaded it.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    46
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    47
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    48
<pre class="code prettyprint">&lt;script src=&quot;http:&#x2F;&#x2F;yui.yahooapis.com&#x2F;3.10.3&#x2F;build&#x2F;yui&#x2F;yui-min.js&quot;&gt;&lt;&#x2F;script&gt;</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    49
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    50
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    51
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    52
Next, create a new YUI instance for your application and populate it with the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    53
modules you need by specifying them as arguments to the <code>YUI().use()</code> method.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    54
YUI will automatically load any dependencies required by the modules you
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    55
specify.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    56
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    57
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    58
<pre class="code prettyprint">&lt;script&gt;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    59
&#x2F;&#x2F; Create a new YUI instance and populate it with the required modules.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    60
YUI().use(&#x27;model&#x27;, function (Y) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    61
    &#x2F;&#x2F; Model is available and ready for use. Add implementation
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    62
    &#x2F;&#x2F; code here.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    63
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    64
&lt;&#x2F;script&gt;</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    65
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    66
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    67
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    68
For more information on creating YUI instances and on the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    69
<a href="http://yuilibrary.com/yui/docs/api/classes/YUI.html#method_use"><code>use()</code> method</a>, see the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    70
documentation for the <a href="../yui/index.html">YUI Global Object</a>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    71
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    72
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    73
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    74
<h2 id="what-is-a-model">What is a Model?</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    75
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    76
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    77
A model is a class that manages data, state, and behavior associated with an application or a part of an application.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    78
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    79
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    80
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    81
For example, in a photo gallery, you might use a model to represent each photo. The model would contain information about the image file, a caption, tags, etc., along with methods for working with this data. The model would also be responsible for validating any new data before accepting it.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    82
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    83
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    84
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    85
While Model may be used as a standalone component, it's common to associate a Model instance with a <a href="../view/index.html">View</a> instance, which is responsible for rendering the visual representation of the data contained in the model and updating that representation when the model changes.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    86
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    87
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    88
<h2 id="using-model">Using Model</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    89
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    90
<h3 id="quick-start">Quick Start</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    91
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    92
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    93
The quickest way to get up and running with Model is to create a new instance of the <code>Y.Model</code> class and pass in an object of key/value pairs representing attributes to set (note: creating ad-hoc attributes like this requires YUI 3.5.0 or higher).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    94
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    95
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    96
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    97
Here's how you might create a simple model representing a delicious pie (imagine you're building an online ordering system for a bakery):
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    98
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    99
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   100
<pre class="code prettyprint">var applePie = new Y.Model({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   101
  slices: 6,       &#x2F;&#x2F; number of slices in this pie
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   102
  type  : &#x27;apple&#x27;  &#x2F;&#x2F; what type of pie this is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   103
});</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   104
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   105
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   106
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   107
This creates a new <code>Y.Model</code> instance named <code>applePie</code>, with two attributes: <code>slices</code> and <code>type</code>, in addition to the <a href="#built-in-attributes">built-in attributes</a> <code>id</code> and <code>clientId</code>, which are available on all models.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   108
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   109
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   110
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   111
Pass the name of an attribute to the model's <code>get()</code> function to get that attribute's value.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   112
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   113
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   114
<pre class="code prettyprint">applePie.get(&#x27;slices&#x27;); &#x2F;&#x2F; =&gt; 6
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   115
applePie.get(&#x27;type&#x27;); &#x2F;&#x2F; =&gt; &quot;apple&quot;</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   116
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   117
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   118
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   119
To change the value of an attribute, pass its name and new value to <code>set()</code>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   120
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   121
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   122
<pre class="code prettyprint">applePie.set(&#x27;slices&#x27;, 5); &#x2F;&#x2F; someone ate a slice!</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   123
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   124
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   125
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   126
Read on to learn how to create custom model subclasses for representing more complex data and logic, or skip ahead to <a href="#model-events">Model Events</a> or <a href="#getting-and-setting-attribute-values">Getting and Setting Attribute Values</a> to learn more about how to take advantage of the useful state management functionality Model provides.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   127
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   128
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   129
<h3 id="extending-ymodel">Extending <code>Y.Model</code></h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   130
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   131
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   132
The ability to create ad-hoc models by instantiating <code>Y.Model</code> is convenient, but sometimes it can be useful to create a custom Model subclass by <em>extending</em> <code>Y.Model</code>. This allows you to declare the data attributes your Model class will manage up front, as well as specify default attribute values, helper methods, validators, and (optionally) a sync layer to help your Model class communicate with a storage API or a remote server.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   133
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   134
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   135
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   136
In this example, we'll create a <code>Y.PieModel</code> class. Each instance of this class will represent a delicious pie, fresh from the oven.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   137
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   138
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   139
<pre class="code prettyprint">&#x2F;&#x2F; Create a new Y.PieModel class that extends Y.Model.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   140
Y.PieModel = Y.Base.create(&#x27;pieModel&#x27;, Y.Model, [], {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   141
  &#x2F;&#x2F; Add prototype methods for your Model here if desired. These methods will be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   142
  &#x2F;&#x2F; available to all instances of your Model.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   143
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   144
  &#x2F;&#x2F; Returns true if all the slices of the pie have been eaten.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   145
  allGone: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   146
    return this.get(&#x27;slices&#x27;) === 0;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   147
  },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   148
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   149
  &#x2F;&#x2F; Consumes a slice of pie, or fires an &#x60;error&#x60; event if there are no slices
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   150
  &#x2F;&#x2F; left.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   151
  eatSlice: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   152
    if (this.allGone()) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   153
      this.fire(&#x27;error&#x27;, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   154
        type : &#x27;eat&#x27;,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   155
        error: &quot;Oh snap! There isn&#x27;t any pie left.&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   156
      });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   157
    } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   158
      this.set(&#x27;slices&#x27;, this.get(&#x27;slices&#x27;) - 1);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   159
      Y.log(&#x27;You just ate a slice of delicious &#x27; + this.get(&#x27;type&#x27;) + &#x27; pie!&#x27;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   160
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   161
  }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   162
}, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   163
  ATTRS: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   164
    &#x2F;&#x2F; Add custom model attributes here. These attributes will contain your
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   165
    &#x2F;&#x2F; model&#x27;s data. See the docs for Y.Attribute to learn more about defining
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   166
    &#x2F;&#x2F; attributes.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   167
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   168
    slices: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   169
      value: 6 &#x2F;&#x2F; default value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   170
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   171
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   172
    type: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   173
      value: &#x27;apple&#x27;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   174
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   175
  }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   176
});</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   177
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   178
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   179
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   180
Now we can create instances of <code>Y.PieModel</code> to represent delicious pies.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   181
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   182
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   183
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   184
Each instance will have a <code>type</code> attribute containing the type of the pie and a <code>slices</code> attribute containing the number of slices remaining. We can call the <code>allGone()</code> method to check whether there are any slices left, and the <code>eatSlice()</code> method to eat a slice.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   185
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   186
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   187
<pre class="code prettyprint">&#x2F;&#x2F; Bake a delicious new pecan pie.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   188
var pecanPie = new Y.PieModel({type: &#x27;pecan&#x27;});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   189
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   190
pecanPie.on(&#x27;error&#x27;, function (e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   191
  Y.log(e.error);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   192
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   193
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   194
pecanPie.eatSlice(); &#x2F;&#x2F; =&gt; &quot;You just ate a slice of delicious pecan pie!&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   195
Y.log(pecanPie.get(&#x27;slices&#x27;)); &#x2F;&#x2F; =&gt; 5</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   196
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   197
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   198
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   199
Five slices later, our pie will be all gone. If we try to eat another slice, we'll get an <code>error</code> event.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   200
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   201
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   202
<pre class="code prettyprint">&#x2F;&#x2F; 5 slices later...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   203
pecanPie.eatSlice(); &#x2F;&#x2F; =&gt; &quot;Oh snap! There isn&#x27;t any pie left.&quot;</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   204
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   205
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   206
<h3 id="model-attributes">Model Attributes</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   207
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   208
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   209
A Model's data is represented by <a href="../attribute/index.html">attributes</a>. The Model class provides two built-in attributes, <code>clientId</code> and <code>id</code>. The rest are up to you to define when you extend <code>Y.Model</code>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   210
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   211
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   212
<h4 id="built-in-attributes">Built-in Attributes</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   213
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   214
<table>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   215
  <thead>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   216
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   217
      <th>Attribute</th>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   218
      <th>Default Value</th>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   219
      <th>Description</th>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   220
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   221
  </thead>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   222
  <tbody>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   223
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   224
      <td><code>clientId</code></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   225
      <td><em>generated id</em></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   226
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   227
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   228
        An automatically generated client-side only unique ID for identifying model instances that don't yet have an <code>id</code>. The client id is guaranteed to be unique among all models on the current page, but is not unique across pageviews. Client ids are never included in <code>toJSON()</code> output.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   229
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   230
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   231
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   232
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   233
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   234
      <td><code>id</code></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   235
      <td><code>null</code></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   236
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   237
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   238
        A globally unique identifier for the model instance. If this is <code>null</code>, then the model instance is assumed to be "new" (meaning it hasn't yet been saved to a persistence layer). If the model represents data that's stored in a database of some kind, it usually makes sense to use the database's primary key here.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   239
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   240
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   241
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   242
        If your persistence layer uses a primary key with a name other than <code>id</code>, you can override the <code>idAttribute</code> property and set it to the name of your custom id attribute when extending <code>Y.Model</code> (be sure to define a corresponding attribute as well). The <code>id</code> attribute will then act as an alias for your custom id attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   243
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   244
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   245
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   246
  </tbody>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   247
</table>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   248
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   249
<h4 id="custom-attributes">Custom Attributes</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   250
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   251
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   252
Custom attributes are where all your model's data should live. You define these attributes when you first extend <code>Y.Model</code>. You can set their values by passing a config object into the model's constructor, or by calling the model's <code>set()</code> or <code>setAttrs()</code> methods..
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   253
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   254
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   255
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   256
Attributes can specify default values, getters and setters, validators, and more. For details, see the documentation for the <a href="../attribute/index.html">Attribute</a> component.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   257
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   258
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   259
<h3 id="model-properties">Model Properties</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   260
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   261
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   262
The following properties are available on Model instances. The <code>idAttribute</code> property may be overridden when extending <code>Y.Model</code>; the others are intended to be read-only.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   263
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   264
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   265
<table>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   266
  <thead>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   267
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   268
      <th>Property</th>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   269
      <th>Type</th>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   270
      <th>Description</th>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   271
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   272
  </thead>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   273
  <tbody>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   274
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   275
      <td><code>changed</code></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   276
      <td>Object</td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   277
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   278
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   279
        Hash of attributes that have changed since the last time the model was saved.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   280
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   281
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   282
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   283
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   284
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   285
      <td><code>idAttribute</code></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   286
      <td>String</td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   287
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   288
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   289
        Name of the attribute to use as the unique id for the model. Defaults to "id", but you may override this property when extending <code>Y.Model</code> if you want to specify a custom id attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   290
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   291
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   292
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   293
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   294
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   295
      <td><code>lastChange</code></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   296
      <td>Object</td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   297
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   298
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   299
        Hash of attributes that were changed in the most recent <code>change</code> event. Each item in this hash is an object with the following properties:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   300
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   301
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   302
        <dl style="margin-top: 1em;">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   303
          <dt><strong><code>newVal</code></strong></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   304
          <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   305
            <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   306
            The new value of the attribute after it changed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   307
            </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   308
          </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   309
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   310
          <dt><strong><code>prevVal</code></strong></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   311
          <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   312
            <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   313
            The old value of the attribute before it changed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   314
            </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   315
          </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   316
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   317
          <dt><strong><code>src</code></strong></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   318
          <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   319
            <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   320
            The source of the change, or <code>null</code> if no source was specified when the change was made.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   321
            </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   322
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   323
            <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   324
            This can be set to any string you want by passing an options object like <code>{src: &#x27;foo&#x27;}</code> to the <code>set()</code> or <code>setAttrs()</code> methods when changing attribute values. Its purpose is to allow you to identify the source of the change later by inspecting the <code>src</code> property associated with an event, so choose a string that has meaning for your particular use case.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   325
            </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   326
          </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   327
        </dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   328
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   329
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   330
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   331
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   332
      <td><code>lists</code></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   333
      <td>Array</td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   334
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   335
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   336
        Array of <a href="../model-list/index.html">ModelList</a> instances that contain this model.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   337
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   338
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   339
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   340
        This property is updated automatically when the model is added to or removed from a ModelList instance. You shouldn't alter it manually. When working with models in a list, you should always add and remove models using the list's <code>add()</code> and <code>remove()</code> methods.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   341
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   342
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   343
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   344
  </tbody>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   345
</table>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   346
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   347
<h3 id="model-events">Model Events</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   348
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   349
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   350
Model instances provide the following events:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   351
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   352
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   353
<table>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   354
  <thead>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   355
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   356
      <th>Event</th>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   357
      <th>When</th>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   358
      <th>Payload</th>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   359
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   360
  </thead>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   361
  <tbody>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   362
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   363
      <td><code>change</code></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   364
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   365
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   366
        One or more attributes on the model are changed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   367
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   368
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   369
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   370
        <dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   371
          <dt><code>changed</code> (<em>Object</em>)</dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   372
          <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   373
            <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   374
            Hash of change information for each attribute that changed. Keys are attribute names, values are objects with the following properties:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   375
            </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   376
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   377
            <dl style="margin-top: 1em;">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   378
              <dt><code>newVal</code></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   379
              <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   380
                <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   381
                The new value of the attribute after it changed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   382
                </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   383
              </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   384
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   385
              <dt><code>prevVal</code></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   386
              <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   387
                <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   388
                The old value of the attribute before it changed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   389
                </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   390
              </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   391
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   392
              <dt><code>src</code></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   393
              <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   394
                <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   395
                The source of the change, or <code>null</code> if no source was specified when the change was made.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   396
                </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   397
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   398
                <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   399
                This can be set to any string you want by passing an options object like <code>{src: &#x27;foo&#x27;}</code> to the <code>set()</code> or <code>setAttrs()</code> methods when changing attribute values. Its purpose is to allow you to identify the source of the change later by inspecting the <code>src</code> property associated with an event, so choose a string that has meaning for your particular use case.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   400
                </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   401
              </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   402
            </dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   403
          </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   404
        </dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   405
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   406
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   407
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   408
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   409
      <td><code>error</code></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   410
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   411
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   412
        An error occurs, such as when the model fails validation or a sync layer response can't be parsed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   413
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   414
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   415
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   416
        <dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   417
          <dt><code>error</code></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   418
          <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   419
            <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   420
              Error message, object, or exception generated by the error. Calling <code>toString()</code> on this should result in a meaningful error message.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   421
            </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   422
          </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   423
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   424
          <dt><code>src</code></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   425
          <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   426
            <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   427
            Source of the error. May be one of the following default sources, or any custom error source used by your Model subclass):
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   428
            </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   429
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   430
            <dl style="margin-top: 1em;">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   431
              <dt><code>load</code></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   432
              <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   433
                <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   434
                An error loading the model from a sync layer. The sync layer's response (if any) will be provided as the <code>response</code> property on the event facade.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   435
                </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   436
              </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   437
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   438
              <dt><code>parse</code></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   439
              <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   440
                <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   441
                An error parsing a response from a sync layer.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   442
                </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   443
              </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   444
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   445
              <dt><code>save</code></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   446
              <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   447
                <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   448
                An error saving the model to a sync layer. The sync layer's response (if any) will be provided as the <code>response</code> property on the event facade.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   449
                </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   450
              </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   451
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   452
              <dt><code>validate</code></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   453
              <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   454
                <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   455
                The model failed to validate.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   456
                </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   457
              </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   458
            </dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   459
          </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   460
        </dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   461
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   462
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   463
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   464
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   465
      <td><code>load</code></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   466
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   467
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   468
        After model attributes are loaded from a sync layer.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   469
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   470
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   471
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   472
        <dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   473
          <dt><code>parsed</code></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   474
          <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   475
            <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   476
            The parsed version of the sync layer's response to the load request.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   477
            </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   478
          </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   479
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   480
          <dt><code>response</code></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   481
          <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   482
            <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   483
            The sync layer's raw, unparsed response to the load request.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   484
            </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   485
          </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   486
        </dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   487
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   488
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   489
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   490
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   491
      <td><code>save</code></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   492
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   493
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   494
        After model attributes are saved to a sync layer.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   495
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   496
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   497
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   498
        <dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   499
          <dt><code>parsed</code></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   500
          <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   501
            <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   502
            The parsed version of the sync layer's response to the save request.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   503
            </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   504
          </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   505
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   506
          <dt><code>response</code></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   507
          <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   508
            <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   509
            The sync layer's raw, unparsed response to the save request.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   510
            </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   511
          </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   512
        </dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   513
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   514
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   515
  </tbody>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   516
</table>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   517
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   518
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   519
A model's events bubble up to any <a href="../model-list/index.html">model lists</a> that the model belongs to. This enables you to use the model list as a central point for handling model value changes and errors.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   520
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   521
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   522
<h4 id="change-events">Change Events</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   523
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   524
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   525
In addition to the master <code>change</code> event, which is fired whenever one or more attributes are changed, there are also change events for each individual attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   526
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   527
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   528
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   529
Attribute-level change events follow the naming scheme <code><em>name</em>Change</code>, where <em>name</em> is the name of an attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   530
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   531
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   532
<pre class="code prettyprint">&#x2F;&#x2F; Bake a new pie model.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   533
var pie = new Y.PieModel();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   534
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   535
&#x2F;&#x2F; Listen for all attribute changes.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   536
pie.on(&#x27;change&#x27;, function (e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   537
  Y.log(&#x27;change fired: &#x27; + Y.Object.keys(e.changed).join(&#x27;, &#x27;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   538
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   539
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   540
&#x2F;&#x2F; Listen for changes to the &#x60;slices&#x60; attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   541
pie.on(&#x27;slicesChange&#x27;, function (e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   542
  Y.log(&#x27;slicesChange fired&#x27;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   543
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   544
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   545
&#x2F;&#x2F; Listen for changes to the &#x60;type&#x60; attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   546
pie.on(&#x27;typeChange&#x27;, function (e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   547
  Y.log(&#x27;typeChange fired&#x27;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   548
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   549
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   550
&#x2F;&#x2F; Change multiple attributes at once.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   551
pie.setAttrs({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   552
  slices: 3,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   553
  type  : &#x27;maple custard&#x27;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   554
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   555
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   556
&#x2F;&#x2F; =&gt; &quot;slicesChange fired&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   557
&#x2F;&#x2F; =&gt; &quot;typeChange fired&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   558
&#x2F;&#x2F; =&gt; &quot;change fired: slices, type&quot;</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   559
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   560
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   561
<h4 id="firing-your-own-error-events">Firing Your Own Error Events</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   562
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   563
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   564
In your custom model class, there may be situations beyond just parsing and validating in which an <code>error</code> event would be useful. For example, in the <code>Y.PieModel</code> class, we fire an error when someone tries to eat a slice of pie and there are no slices left.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   565
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   566
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   567
<pre class="code prettyprint">&#x2F;&#x2F; Consumes a slice of pie, or fires an &#x60;error&#x60; event if there are no slices
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   568
&#x2F;&#x2F; left.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   569
eatSlice: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   570
  if (this.allGone()) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   571
    this.fire(&#x27;error&#x27;, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   572
      type : &#x27;eat&#x27;,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   573
      error: &quot;Oh snap! There isn&#x27;t any pie left.&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   574
    });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   575
  } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   576
    this.set(&#x27;slices&#x27;, this.get(&#x27;slices&#x27;) - 1);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   577
    Y.log(&#x27;You just ate a slice of delicious &#x27; + this.get(&#x27;type&#x27;) + &#x27; pie!&#x27;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   578
  }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   579
}</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   580
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   581
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   582
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   583
When firing an error event, set the <code>type</code> property to something that users of your class can use to identify the type of error that has occurred. In the example above, we set it to "eat", because it occurred when the caller tried to eat a slice of pie.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   584
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   585
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   586
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   587
The <code>error</code> property should be set to an error message, an Error object, or anything else that provides information about the error and has a <code>toString()</code> method that returns an error message string.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   588
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   589
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   590
<h3 id="working-with-model-data">Working with Model Data</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   591
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   592
<h4 id="getting-and-setting-attribute-values">Getting and Setting Attribute Values</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   593
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   594
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   595
Model's <code>get()</code> and <code>set()</code> methods are the main ways of interacting with model attributes. Unsurprisingly, they allow you to get and set the value of a single attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   596
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   597
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   598
<pre class="code prettyprint">var pie = new Y.PieModel();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   599
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   600
&#x2F;&#x2F; Set the value of the &#x60;type&#x60; attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   601
pie.set(&#x27;type&#x27;, &#x27;banana cream&#x27;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   602
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   603
&#x2F;&#x2F; Get the value of the &#x60;type&#x60; attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   604
pie.get(&#x27;type&#x27;); &#x2F;&#x2F; =&gt; &quot;banana cream&quot;</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   605
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   606
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   607
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   608
Model also provides two convenience methods for getting and escaping an attribute value in a single step. The <code>getAsHTML()</code> method returns an HTML-escaped value, and the <code>getAsURL()</code> method returns a URL-encoded value.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   609
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   610
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   611
<pre class="code prettyprint">pie.set(&#x27;type&#x27;, &#x27;strawberries &amp; cream&#x27;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   612
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   613
pie.getAsHTML(&#x27;type&#x27;); &#x2F;&#x2F; =&gt; &quot;strawberries &amp;amp; cream&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   614
pie.getAsURL(&#x27;type&#x27;);  &#x2F;&#x2F; =&gt; &quot;strawberries%20%26%20cream&quot;</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   615
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   616
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   617
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   618
The <code>getAttrs()</code> and <code>setAttrs()</code> methods may be used to get and set multiple attributes at once. <code>getAttrs()</code> returns a hash of all attribute values, while <code>setAttrs()</code> accepts a hash of attribute values. When you set multiple attributes with <code>setAttrs()</code>, it fires only a single change event that contains all the affected attributes..
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   619
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   620
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   621
<pre class="code prettyprint">pie.setAttrs({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   622
  slices: 6,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   623
  type  : &#x27;marionberry&#x27;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   624
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   625
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   626
pie.getAttrs();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   627
&#x2F;&#x2F; =&gt; {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   628
&#x2F;&#x2F;   clientId: &quot;pieModel_1&quot;,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   629
&#x2F;&#x2F;   destroyed: false,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   630
&#x2F;&#x2F;   id: null,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   631
&#x2F;&#x2F;   initialized: true,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   632
&#x2F;&#x2F;   slices: 6,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   633
&#x2F;&#x2F;   type: &quot;marionberry&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   634
&#x2F;&#x2F; }</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   635
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   636
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   637
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   638
The <code>destroyed</code> and <code>initialized</code> attributes you see in the sample output above are lifecycle attributes provided by <code>Y.Base</code>, and aren't actually model data.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   639
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   640
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   641
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   642
To get a slightly more useful representation of model data, use the <code>toJSON()</code> method. The <code>toJSON()</code> method excludes the <code>clientId</code>, <code>destroyed</code>, and <code>initialized</code> attributes, making the resulting object more suitable for serialization and for storing in a persistence layer.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   643
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   644
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   645
<pre class="code prettyprint">pie.toJSON();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   646
&#x2F;&#x2F; =&gt; {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   647
&#x2F;&#x2F;   id: null,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   648
&#x2F;&#x2F;   slices: 6,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   649
&#x2F;&#x2F;   type: &quot;marionberry&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   650
&#x2F;&#x2F; }</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   651
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   652
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   653
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   654
If a custom <code>idAttribute</code> is in use, the <code>toJSON()</code> output will include that id attribute instead of <code>id</code>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   655
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   656
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   657
<pre class="code prettyprint">&#x2F;&#x2F; toJSON() output with a custom id attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   658
pie.toJSON();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   659
&#x2F;&#x2F; =&gt; {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   660
&#x2F;&#x2F;   customId: null,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   661
&#x2F;&#x2F;   slices: 6,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   662
&#x2F;&#x2F;   type: &quot;marionberry&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   663
&#x2F;&#x2F; }</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   664
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   665
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   666
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   667
If you'd like to customize the serialized representation of your models, you may override the <code>toJSON()</code> method.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   668
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   669
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   670
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   671
When using the <code>set()</code> and <code>setAttrs()</code> methods, you may pass an optional <code>options</code> argument. If <code>options.silent</code> is <code>true</code>, no <code>change</code> event will be fired.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   672
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   673
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   674
<pre class="code prettyprint">&#x2F;&#x2F; Set attributes without firing a &#x60;change&#x60; event.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   675
pie.set(&#x27;slices&#x27;, 0, {silent: true});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   676
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   677
pie.setAttrs({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   678
  slices: 0,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   679
  type  : &#x27;chocolate cream&#x27;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   680
}, {silent: true});</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   681
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   682
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   683
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   684
After making changes to a model's attributes, you may call the <code>undo()</code> method to undo the previous change.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   685
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   686
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   687
<pre class="code prettyprint">var pie = new Y.PieModel({slices: 6});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   688
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   689
pie.set(&#x27;slices&#x27;, 5);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   690
pie.undo();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   691
pie.get(&#x27;slices&#x27;); &#x2F;&#x2F; =&gt; 6</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   692
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   693
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   694
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   695
Note that there's only a single level of undo, so it's not possible to revert past the most recent change.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   696
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   697
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   698
<h4 id="validating-changes">Validating Changes</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   699
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   700
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   701
Validating model changes as they occur is a good way to ensure that the data in your models isn't nonsense, especially when dealing with user input.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   702
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   703
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   704
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   705
There are two ways to validate model attributes. One way is to define an attribute validator function for an individual attribute when you extend <code>Y.Model</code>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   706
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   707
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   708
<pre class="code prettyprint">&#x2F;&#x2F; Defining an individual attribute validator.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   709
Y.PieModel = Y.Base.create(&#x27;pieModel&#x27;, Y.Model, [], {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   710
  &#x2F;&#x2F; ... prototype methods and properties ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   711
}, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   712
  ATTRS: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   713
    slices: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   714
      value: 6,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   715
      validator: function (value) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   716
        return typeof value === &#x27;number&#x27; &amp;&amp; value &gt;= 0 &amp;&amp; value &lt;= 10;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   717
      }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   718
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   719
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   720
    &#x2F;&#x2F; ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   721
  }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   722
});</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   723
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   724
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   725
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   726
An attribute validator will be called whenever that attribute changes, and can prevent the change from taking effect by returning <code>false</code>. Model <code>error</code> events are not fired when attribute validators fail. For more details on attribute validators, see the <a href="../attribute/index.html">Attribute User Guide</a>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   727
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   728
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   729
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   730
The second way to validate changes is to provide a custom <code>validate()</code> method when extending <code>Y.Model</code>. The <code>validate()</code> method will be called automatically when <code>save()</code> is called, and will receive a hash of all the attributes in the model. Validation can be an asyncronous process, and the <code>validation()</code> method takes a <code>callback()</code> function. If your <code>validate()</code> method calls the <code>callback()</code> with an argument other than <code>null</code>, or <code>undefined</code>, it will be considered a validation failure, an <code>error</code> event will be fired with the returned value as the error message, and the <code>save()</code> action will be aborted.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   731
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   732
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   733
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   734
To indicate success, call the provided <code>callback()</code> function with no arguments from your validation method. To indicate failure, call the provided <code>callback()</code> function with a single argument, which may contain an error message, an array of error messages, or any other value. On validation failure an <code>error</code> event will be fired with the passed argument as the error message.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   735
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   736
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   737
<pre class="code prettyprint">&#x2F;&#x2F; Defining a model-wide &#x60;validator()&#x60; method.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   738
Y.PieModel = Y.Base.create(&#x27;pieModel&#x27;, Y.Model, [], {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   739
  &#x2F;&#x2F; ... prototype methods and properties ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   740
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   741
  validate: function (attributes, callback) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   742
    var slices;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   743
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   744
    switch (attributes.type) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   745
    case &#x27;rhubarb&#x27;:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   746
      callback(&#x27;Eww. No. Not allowed.&#x27;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   747
      return;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   748
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   749
    case &#x27;maple custard&#x27;:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   750
      slices = Y.Lang.isValue(attributes.slices) ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   751
          attributes.slices : this.get(&#x27;slices&#x27;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   752
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   753
      if (slices &lt; 10) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   754
        callback(&quot;Making fewer than 10 slices of maple custard pie would be &quot; +
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   755
            &quot;silly, because I&#x27;m just going to eat 8 of them as soon as it&#x27;s &quot; +
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   756
            &quot;out of the oven.&quot;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   757
        return;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   758
      }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   759
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   760
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   761
    &#x2F;&#x2F; Success!
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   762
    callback();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   763
  }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   764
}, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   765
  &#x2F;&#x2F; ... attributes ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   766
});</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   767
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   768
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   769
<h4 id="loading-and-saving-model-data">Loading and Saving Model Data</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   770
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   771
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   772
Calling a model's <code>load()</code> and <code>save()</code> methods will result in a behind-the-scenes call to the model's <code>sync()</code> method specifying the appropriate action.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   773
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   774
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   775
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   776
The default <code>sync()</code> method does nothing, but by overriding it and providing your own sync layer, you can make it possible to create, read, update, and delete models from a persistence layer or a server. See <a href="#implementing-a-model-sync-layer">Implementing a Model Sync Layer</a> for more details.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   777
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   778
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   779
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   780
The <code>load()</code> and <code>save()</code> methods each accept two optional parameters: an options object and a callback function. If provided, the options object will be passed to the sync layer, and the callback will be called after the load or save operation is finished. You may provide neither parameter, or just an options object, or just a callback, although if you provide both an options object and a callback, they need to be in that order.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   781
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   782
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   783
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   784
The callback function will receive two parameters: an error (this parameter will be <code>null</code> or <code>undefined</code> if the operation was successful) and a response (which is the result of calling the model's <code>parse()</code> method with whatever response the sync layer returned).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   785
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   786
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   787
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   788
The <code>load()</code> method calls <code>sync()</code> with the <code>read</code> action, and automatically updates the model with the response data (by passing it to <code>parse()</code> and then updating attributes based on the hash that <code>parse()</code> returns) before calling the callback.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   789
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   790
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   791
<pre class="code prettyprint">var pie = new Y.PieModel({id: &#x27;pie123&#x27;});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   792
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   793
&#x2F;&#x2F; Load a pie model, passing a callback that will run when the model has
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   794
&#x2F;&#x2F; been loaded.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   795
pie.load(function (err, response) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   796
  if (!err) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   797
    &#x2F;&#x2F; Success! The model now contains the loaded data.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   798
  }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   799
});</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   800
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   801
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   802
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   803
The <code>save()</code> method will do one of two things: if the model is new (meaning it doesn't yet have an <code>id</code> value), it will call <code>sync()</code> with the "create" action. If the model is not new, then it will call <code>sync()</code> with the "update" action.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   804
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   805
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   806
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   807
If the sync layer returns a response, then <code>save()</code> will update the model's attributes with the response data before calling the callback function.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   808
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   809
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   810
<pre class="code prettyprint">&#x2F;&#x2F; Save a pie model, passing a callback that will run when the model has
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   811
&#x2F;&#x2F; been saved.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   812
pie.save(function (err, response) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   813
  if (!err) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   814
    &#x2F;&#x2F; Success! The model has been saved. If the sync layer returned a response,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   815
    &#x2F;&#x2F; then the model has also been updated with any new data in the response.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   816
  }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   817
});</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   818
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   819
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   820
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   821
In addition to calling the specified callback (if any), the <code>load()</code> and <code>save()</code> methods will fire a <code>load</code> event and a <code>save</code> event respectively on success, or an <code>error</code> event on failure. See <a href="#model-events">Model Events</a> for more details on these events.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   822
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   823
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   824
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   825
Always use the <code>load()</code> or <code>save()</code> methods rather than calling <code>sync()</code> directly, since this ensures that the sync layer's response is passed through the <code>parse()</code> method and that the model's data is updated if necessary.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   826
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   827
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   828
<h2 id="the-model-lifecycle">The Model Lifecycle</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   829
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   830
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   831
When a model is first created and doesn't yet have an <code>id</code> value, it's considered "new". The <code>isNew()</code> method will tell you whether or not a model is new.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   832
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   833
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   834
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   835
Once a model has an <code>id</code> value, either because one was manually set or because the model received one when it was loaded or saved, the model is no longer considered new, since it is assumed to exist in a persistence layer or on a server somewhere.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   836
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   837
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   838
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   839
If a model is new or if any of its attributes have changed since the model was last loaded or saved, the model is considered "modified". The <code>isModified()</code> method will tell you whether or not a model is modified. A successful call to <code>load()</code> or <code>save()</code> will reset a model's "modified" flag.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   840
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   841
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   842
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   843
Finally, a model's <code>destroy()</code> method can be used to destroy the model instance. Calling <code>destroy()</code> with no arguments will destroy only the local model instance, while calling <code>destroy({remove: true})</code> will both destroy the local model instance and call the sync layer with the "delete" action to delete the model from a persistence layer or server.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   844
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   845
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   846
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   847
It's not necessary for a model to support all possible sync actions. A model that's used to represent read-only data might use a sync layer that only implements the <code>read</code> action, for instance. In this case, the other actions should simply be no-ops that either call the sync callback immediately, or pass an error to the sync callback indicating that the action isn't supported (depending on your personal preference).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   848
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   849
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   850
<h2 id="model-sync-layers">Model Sync Layers</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   851
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   852
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   853
A model's <code>save()</code>, <code>load()</code>, and <code>destroy()</code> methods all internally call the model's <code>sync()</code> method to carry out an action. The default <code>sync()</code> method doesn't actually do anything, but you can mix one of the following sync layers into your <code>Y.Model</code>/<code>Y.ModelList</code> subclass or implement a custom sync layer.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   854
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   855
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   856
<h3 id="restful-xhr">RESTful XHR</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   857
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   858
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   859
<code>Y.ModelSync.REST</code> is an extension which provides a RESTful XHR <code>sync()</code> implementation that can be mixed into a Model or ModelList subclass.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   860
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   861
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   862
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   863
This makes it trivial for your Model or ModelList subclasses communicate and transmit their data via RESTful XHR. In most cases you'll only need to provide a value for <code>root</code> when sub-classing <code>Y.Model</code>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   864
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   865
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   866
<pre class="code prettyprint lang-javascript">&#x2F;&#x2F; Create &#x60;Y.User&#x60;, a &#x60;Y.Model&#x60; subclass and mix-in the RESTful XHR sync layer.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   867
Y.User = Y.Base.create(&#x27;user&#x27;, Y.Model, [Y.ModelSync.REST], {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   868
    &#x2F;&#x2F; The root or collection path segment for the server&#x27;s Users resource.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   869
    root: &#x27;&#x2F;users&#x27;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   870
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   871
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   872
var existingUser = new Y.User({id: &#x27;1&#x27;}),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   873
    oldUser      = new Y.User({id: &#x27;2&#x27;}),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   874
    newUser      = new Y.User({name: &#x27;Eric Ferraiuolo&#x27;});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   875
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   876
&#x2F;&#x2F; GET the existing user data from: &quot;&#x2F;users&#x2F;1&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   877
existingUser.load(function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   878
    Y.log(existingUser.get(&#x27;name&#x27;)); &#x2F;&#x2F; =&gt; &quot;Ron Swannson&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   879
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   880
    &#x2F;&#x2F; Correct the user&#x27;s &#x60;name&#x60; and PUT the updated user at: &quot;&#x2F;users&#x2F;1&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   881
    existingUser.set(&#x27;name&#x27;, &#x27;Ron Swanson&#x27;).save();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   882
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   883
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   884
&#x2F;&#x2F; DELETE the old user data at: &quot;&#x2F;users&#x2F;2&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   885
oldUser.destroy({remove: true});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   886
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   887
&#x2F;&#x2F; POST the new user data to: &quot;&#x2F;users&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   888
newUser.save(function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   889
    &#x2F;&#x2F; The server can return the user data with an &#x60;id&#x60; assigned.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   890
    Y.log(newUser.get(&#x27;id&#x27;)); &#x2F;&#x2F; =&gt; &quot;3&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   891
});</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   892
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   893
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   894
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   895
The following sections provide details on how to use and configure the <code>Y.ModelSync.REST</code> extension. You can also refer to the <a href="http://yuilibrary.com/yui/docs/api/classes/ModelSync.REST.html">API docs</a> for more information.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   896
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   897
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   898
<h4 class="no-toc">Configuring URLs</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   899
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   900
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   901
In order for this sync layer to make requests to a server it needs a URL. Some useful conventions have been put in place to generate these URLs, thus reducing the amount of configuration required to use this sync layer.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   902
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   903
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   904
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   905
The <code>url</code> property works in conjunction with the <code>root</code> property to generate the URLs needed to make the XHRs. By simply configuring a <code>root</code> on the prototype of your Model subclass to the URL of collection resource on the server, your model's and model lists' URLs can be automatically generated. The following example sets up a Model and ModelList subclass and configures them to work with this sync layer:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   906
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   907
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   908
<pre class="code prettyprint">Y.User = Y.Base.create(&#x27;user&#x27;, Y.Model, [Y.ModelSync.REST], {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   909
    root: &#x27;&#x2F;users&#x27;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   910
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   911
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   912
Y.Users = Y.Base.create(&#x27;users&#x27;, Y.ModelList, [Y.ModelSync.REST], {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   913
    &#x2F;&#x2F; By convention &#x60;Y.User&#x60;&#x27;s &#x60;root&#x60; will be used for the lists&#x27; URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   914
    model: Y.User
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   915
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   916
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   917
var users = new Y.Users();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   918
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   919
&#x2F;&#x2F; GET users list from: &quot;&#x2F;users&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   920
users.load(function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   921
    var firstUser = users.item(0);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   922
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   923
    Y.log(firstUser.get(&#x27;id&#x27;)); &#x2F;&#x2F; =&gt; &quot;1&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   924
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   925
    &#x2F;&#x2F; PUT updated user data at: &quot;&#x2F;users&#x2F;1&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   926
    firstUser.set(&#x27;name&#x27;, &#x27;Eric&#x27;).save();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   927
});</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   928
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   929
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   930
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   931
By convention, the URL generated for a model when preforming a read, update, or delete action will combine with the configured <code>root</code> with the model's <code>id</code>. When creating the model resource on the server, just the <code>root</code> will be used as the URL.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   932
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   933
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   934
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   935
<strong>Note:</strong> If the <code>root</code> string ends in trailing-slash, the generated URLs will also end with a "/", and if the <code>root</code> does not end with a slash, neither will the generated URLs.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   936
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   937
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   938
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   939
If a <code>url</code> is specified, it will be processed by <code>Y.Lang.sub()</code>, which is useful when the URLs for a Model/ModelList subclass match a specific pattern and can use simple replacement tokens; e.g.:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   940
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   941
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   942
<pre class="code prettyprint">Y.User = Y.Base.create(&#x27;user&#x27;, Y.Model, [Y.ModelSync.REST], {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   943
    root: &#x27;&#x2F;users&#x27;,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   944
    url : &#x27;&#x2F;users&#x2F;{username}&#x27;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   945
});</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   946
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   947
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   948
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   949
<strong>Note:</strong> String subsitituion of the <code>url</code> only use string an number values provided by this object's attribute and/or the <code>options</code> passed to the <code>getURL()</code> method. Do not expect something fancy to happen with Object, Array, or Boolean values, they will simply be ignored.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   950
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   951
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   952
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   953
For more details, refer to the API docs for the <a href="http://yuilibrary.com/yui/docs/api/classes/ModelSync.REST.html#property_root"><code>root</code></a> and <a href="http://yuilibrary.com/yui/docs/api/classes/ModelSync.REST.html#property_url"><code>url</code></a> properties, and the <a href="http://yuilibrary.com/yui/docs/api/classes/ModelSync.REST.html#method_getURL"><code>getURL()</code></a> method.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   954
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   955
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   956
<h4 class="no-toc">Authentic Requests</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   957
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   958
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   959
Anytime a server accepts requests from clients which result in state being changed, the server is susceptible to <a href="https://en.wikipedia.org/wiki/Cross-site_request_forgery">Cross-Site Request Forgery (CSRF)</a> attacks. This extension has build in support for authenticity tokens to help prevent these CSRF attacks.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   960
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   961
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   962
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   963
A CSRF token provided by the server can be embedded in the HTML document and assigned to <code>YUI.Env.CSRF_TOKEN</code> like this:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   964
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   965
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   966
<pre class="code prettyprint lang-html">&lt;script&gt;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   967
    YUI.Env.CSRF_TOKEN = {{session.authenticityToken}};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   968
&lt;&#x2F;script&gt;</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   969
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   970
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   971
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   972
The above should come after YUI seed file so that <code>YUI.Env</code> will be defined.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   973
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   974
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   975
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   976
<strong>Note:</strong> This can be overridden on a per-request basis. See <code>sync()</code> method.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   977
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   978
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   979
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   980
When a value for the CSRF token is provided, either statically or via <code>options</code> passed to the <code>save()</code> and <code>destroy()</code> methods, the applicable HTTP requests will have a <code>X-CSRF-Token</code> header added with the token value.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   981
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   982
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   983
<h4 class="no-toc">Overriding HTTP Defaults</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   984
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   985
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   986
If the server-side HTTP framework isn't RESTful, setting the static <code>Y.ModelSync.REST.EMULATE_HTTP</code> flag to <code>true</code>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   987
will cause all PUT and DELETE requests to instead use the POST HTTP method, and add a <code>X-HTTP-Method-Override</code> HTTP header with the value of the method type which was overridden.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   988
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   989
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   990
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   991
Additionally, the mapping of CRUD actions to HTTP methods can be changed. By default, the static mapping provided by <code>Y.ModelSync.REST.HTTP_METHODS</code> is:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   992
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   993
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   994
<table>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   995
  <thead>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   996
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   997
      <th>CRUD Action</th>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   998
      <th>HTTP Method</th>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   999
      <th>Description</th>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1000
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1001
  </thead>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1002
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1003
  <tbody>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1004
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1005
      <td><code>create</code></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1006
      <td>POST</td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1007
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1008
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1009
        Creates a new resource on the server for the model.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1010
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1011
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1012
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1013
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1014
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1015
      <td><code>read</code></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1016
      <td>GET</td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1017
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1018
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1019
        Loads the data for a model from its resource on the server.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1020
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1021
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1022
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1023
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1024
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1025
      <td><code>update</code></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1026
      <td>PUT</td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1027
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1028
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1029
        Updates the resource on the server with the new model data.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1030
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1031
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1032
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1033
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1034
    <tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1035
      <td><code>delete</code></td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1036
      <td>DELETE</td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1037
      <td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1038
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1039
        Removes the resource for the model from the server.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1040
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1041
      </td>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1042
    </tr>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1043
  </tbody>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1044
</table>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1045
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1046
<h4 class="no-toc">Content-Types Other Than JSON</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1047
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1048
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1049
By default, this extension will communicate with the server using JSON, by setting the <code>Accept</code> and <code>Content-Type</code> HTTP headers for all XHRs to "application/json", it signals the server to process the request bodies as JSON and send JSON responses.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1050
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1051
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1052
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1053
If you're sending and receiving content other than JSON, you can override these default headers on the static <code>Y.ModelSync.REST.HTTP_HEADERS</code> object. Additionally, you'll want to provide custom implementations of your Model subclass' <code>parse()</code> and <code>serialize()</code> methods. The <a href="http://yuilibrary.com/yui/docs/api/classes/ModelSync.REST.html#method_serialize"><code>serialize()</code></a> method is added by this extension, by default it JSON-stringifies to result of calling the model's <code>toJSON()</code> method.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1054
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1055
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1056
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1057
For more information on the <code>Y.ModelSync.REST</code> extension, refer to its <a href="http://yuilibrary.com/yui/docs/api/classes/ModelSync.REST.html">API docs</a>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1058
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1059
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1060
<h3 id="implementing-a-model-sync-layer">Implementing a Model Sync Layer</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1061
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1062
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1063
A sync layer might make Ajax requests to a remote server, or it might act as a wrapper around local storage, or any number of other things. By overriding the <code>sync()</code> method, you can provide a custom sync layer.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1064
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1065
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1066
<h4 id="the-sync-method">The <code>sync()</code> Method</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1067
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1068
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1069
When the <code>sync()</code> method is called, it receives three arguments:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1070
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1071
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1072
<dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1073
  <dt><strong><code>action</code> (<em>String</em>)</strong></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1074
  <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1075
    <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1076
    A string that indicates the intended sync action. May be one of the following values:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1077
    </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1078
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1079
    <dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1080
      <dt><strong><code>create</code></strong></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1081
      <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1082
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1083
        Create a new model record. The "create" action occurs when a model is saved and doesn't yet have an <code>id</code> value.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1084
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1085
      </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1086
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1087
      <dt><strong><code>read</code></strong></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1088
      <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1089
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1090
        Read an existing model record. The record should be identified based on the <code>id</code> attribute of the model.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1091
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1092
      </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1093
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1094
      <dt><strong><code>update</code></strong></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1095
      <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1096
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1097
        Update an existing model record. The "update" action occurs when a model is saved and already has an <code>id</code> value. The record to be updated should be identified based on the <code>id</code> attribute of the model.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1098
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1099
      </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1100
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1101
      <dt><strong><code>delete</code></strong></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1102
      <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1103
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1104
        Delete an existing model record. The record to be deleted should be identified based on the <code>id</code> attribute of the model.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1105
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1106
      </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1107
    </dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1108
  </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1109
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1110
  <dt><strong><code>options</code> (<em>Object</em>)</strong></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1111
  <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1112
    <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1113
    A hash containing any options that were passed to the <code>save()</code>, <code>load()</code> or <code>destroy()</code> method. This may be used to pass custom options to a sync layer.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1114
    </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1115
  </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1116
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1117
  <dt><strong><code>callback</code> (<em>Function</em>)</strong></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1118
  <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1119
    <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1120
    A callback function that should be called when the sync operation is complete. The callback expects to receive the following arguments:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1121
    </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1122
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1123
    <dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1124
      <dt><strong><code>err</code></strong></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1125
      <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1126
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1127
        Error message or object if an error occured, <code>null</code> or <code>undefined</code> if the operation was successful.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1128
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1129
      </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1130
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1131
      <dt><strong><code>response</code></strong></dt>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1132
      <dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1133
        <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1134
        Response from the persistence layer, if any. This will be passed to the <code>parse()</code> method to be parsed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1135
        </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1136
      </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1137
    </dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1138
  </dd>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1139
</dl>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1140
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1141
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1142
Implementing a sync layer is as simple as handling the requested sync action and then calling the callback function. Here's a sample sync layer that stores records in local storage (note: this example requires the <code>json-stringify</code> module):
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1143
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1144
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1145
<pre class="code prettyprint">Y.PieModel = Y.Base.create(&#x27;pieModel&#x27;, Y.Model, [], {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1146
  &#x2F;&#x2F; ... prototype methods and properties ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1147
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1148
  &#x2F;&#x2F; Custom sync layer.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1149
  sync: function (action, options, callback) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1150
    var data;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1151
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1152
    switch (action) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1153
      case &#x27;create&#x27;:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1154
        data = this.toJSON();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1155
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1156
        &#x2F;&#x2F; Use the current timestamp as an id just to simplify the example. In a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1157
        &#x2F;&#x2F; real sync layer, you&#x27;d want to generate an id that&#x27;s more likely to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1158
        &#x2F;&#x2F; be globally unique.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1159
        data.id = Y.Lang.now();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1160
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1161
        &#x2F;&#x2F; Store the new record in localStorage, then call the callback.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1162
        localStorage.setItem(data.id, Y.JSON.stringify(data));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1163
        callback(null, data);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1164
        return;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1165
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1166
      case &#x27;read&#x27;:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1167
        &#x2F;&#x2F; Look for an item in localStorage with this model&#x27;s id.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1168
        data = localStorage.getItem(this.get(&#x27;id&#x27;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1169
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1170
        if (data) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1171
          callback(null, data);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1172
        } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1173
          callback(&#x27;Model not found.&#x27;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1174
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1175
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1176
        return;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1177
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1178
      case &#x27;update&#x27;:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1179
        data = this.toJSON();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1180
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1181
        &#x2F;&#x2F; Update the record in localStorage, then call the callback.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1182
        localStorage.setItem(this.get(&#x27;id&#x27;), Y.JSON.stringify(data));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1183
        callback(null, data);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1184
        return;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1185
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1186
      case &#x27;delete&#x27;:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1187
        localStorage.removeItem(this.get(&#x27;id&#x27;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1188
        callback();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1189
        return;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1190
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1191
      default:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1192
        callback(&#x27;Invalid action&#x27;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1193
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1194
  }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1195
}, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1196
  &#x2F;&#x2F; ... attributes ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1197
});</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1198
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1199
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1200
<h4 id="the-parse-method">The <code>parse()</code> Method</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1201
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1202
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1203
Depending on the kind of response your sync layer returns, you may need to override the <code>parse()</code> method as well. The default <code>parse()</code> implementation knows how to parse JavaScript objects and JSON strings that can be parsed into JavaScript objects representing a hash of attributes. If your response data is in another format, such as a nested JSON response or XML, override the <code>parse()</code> method to provide a custom parser implementation.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1204
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1205
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1206
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1207
If an error occurs while parsing a response, fire an <code>error</code> event with <code>type</code> "parse".
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1208
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1209
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1210
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1211
This sample demonstrates a custom parser for responses in which the model data is contained in a <code>data</code> property of the response object.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1212
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1213
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1214
<pre class="code prettyprint">&#x2F;&#x2F; Custom response parser.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1215
parse: function (response) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1216
  if (response.data) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1217
    return response.data;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1218
  }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1219
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1220
  this.fire(&#x27;error&#x27;, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1221
    type : &#x27;parse&#x27;,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1222
    error: &#x27;No data in the response.&#x27;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1223
  });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1224
}</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1225
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1226
</div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1227
            </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1228
        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1229
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1230
        <div class="yui3-u-1-4">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1231
            <div class="sidebar">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1232
                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1233
                    <div id="toc" class="sidebox">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1234
                        <div class="hd">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1235
                            <h2 class="no-toc">Table of Contents</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1236
                        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1237
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1238
                        <div class="bd">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1239
                            <ul class="toc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1240
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1241
<a href="#getting-started">Getting Started</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1242
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1243
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1244
<a href="#what-is-a-model">What is a Model?</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1245
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1246
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1247
<a href="#using-model">Using Model</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1248
<ul class="toc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1249
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1250
<a href="#quick-start">Quick Start</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1251
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1252
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1253
<a href="#extending-ymodel">Extending <code>Y.Model</code></a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1254
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1255
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1256
<a href="#model-attributes">Model Attributes</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1257
<ul class="toc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1258
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1259
<a href="#built-in-attributes">Built-in Attributes</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1260
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1261
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1262
<a href="#custom-attributes">Custom Attributes</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1263
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1264
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1265
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1266
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1267
<a href="#model-properties">Model Properties</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1268
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1269
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1270
<a href="#model-events">Model Events</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1271
<ul class="toc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1272
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1273
<a href="#change-events">Change Events</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1274
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1275
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1276
<a href="#firing-your-own-error-events">Firing Your Own Error Events</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1277
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1278
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1279
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1280
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1281
<a href="#working-with-model-data">Working with Model Data</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1282
<ul class="toc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1283
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1284
<a href="#getting-and-setting-attribute-values">Getting and Setting Attribute Values</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1285
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1286
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1287
<a href="#validating-changes">Validating Changes</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1288
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1289
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1290
<a href="#loading-and-saving-model-data">Loading and Saving Model Data</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1291
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1292
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1293
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1294
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1295
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1296
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1297
<a href="#the-model-lifecycle">The Model Lifecycle</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1298
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1299
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1300
<a href="#model-sync-layers">Model Sync Layers</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1301
<ul class="toc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1302
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1303
<a href="#restful-xhr">RESTful XHR</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1304
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1305
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1306
<a href="#implementing-a-model-sync-layer">Implementing a Model Sync Layer</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1307
<ul class="toc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1308
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1309
<a href="#the-sync-method">The <code>sync()</code> Method</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1310
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1311
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1312
<a href="#the-parse-method">The <code>parse()</code> Method</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1313
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1314
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1315
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1316
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1317
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1318
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1319
                        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1320
                    </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1321
                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1322
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1323
                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1324
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1325
                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1326
                    <div class="sidebox">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1327
                        <div class="hd">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1328
                            <h2 class="no-toc">Examples That Use This Component</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1329
                        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1330
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1331
                        <div class="bd">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1332
                            <ul class="examples">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1333
                                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1334
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1335
                                        <li data-description="A basic todo list built with the Model, Model List, and View components.">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1336
                                            <a href="../app/app-todo.html">Todo List</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1337
                                        </li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1338
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1339
                                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1340
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1341
                                        <li data-description="An application to browse through the contributors of a GitHub project.">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1342
                                            <a href="../app/app-contributors.html">GitHub Contributors</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1343
                                        </li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1344
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1345
                                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1346
                            </ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1347
                        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1348
                    </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1349
                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1350
            </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1351
        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1352
    </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1353
</div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1354
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1355
<script src="../assets/vendor/prettify/prettify-min.js"></script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1356
<script>prettyPrint();</script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1357
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1358
<script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1359
YUI.Env.Tests = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1360
    examples: [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1361
    project: '../assets',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1362
    assets: '../assets/model',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1363
    name: 'model',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1364
    title: 'Model',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1365
    newWindow: '',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1366
    auto:  false 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1367
};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1368
YUI.Env.Tests.examples.push('app-todo');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1369
YUI.Env.Tests.examples.push('app-contributors');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1370
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1371
</script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1372
<script src="../assets/yui/test-runner.js"></script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1373
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1374
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1375
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1376
</body>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1377
</html>