UNPKG

dtx-backbone-associations

Version:

Create object hierarchies with Backbone models. Respond to hierarchy changes using regular Backbone events

138 lines (122 loc) 173 kB
<!DOCTYPE html> <html> <head> <title>backbone-associations.js</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> backbone-associations.js </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-1">&#182;</a> </div> <p>Backbone-associations.js 0.6.2</p> <p>(c) 2014 Dhruva Ray, Jaynti Kanani, Persistent Systems Ltd. Backbone-associations may be freely distributed under the MIT license. For all details and documentation: https://github.com/dhruvaray/backbone-associations/</p> </td> <td class="code"> <div class="highlight"><pre><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">root</span><span class="p">,</span> <span class="nx">factory</span><span class="p">)</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-2">&#182;</a> </div> <p>Set up Backbone-associations appropriately for the environment. Start with AMD.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">define</span> <span class="o">===</span> <span class="s1">&#39;function&#39;</span> <span class="o">&amp;&amp;</span> <span class="nx">define</span><span class="p">.</span><span class="nx">amd</span><span class="p">)</span> <span class="p">{</span> <span class="nx">define</span><span class="p">([</span><span class="s1">&#39;underscore&#39;</span><span class="p">,</span> <span class="s1">&#39;backbone&#39;</span><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">_</span><span class="p">,</span> <span class="nx">Backbone</span><span class="p">)</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">&#182;</a> </div> <p>Export global even in AMD case in case this script is loaded with others that may still expect a global Backbone.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">return</span> <span class="nx">factory</span><span class="p">(</span><span class="nx">root</span><span class="p">,</span> <span class="nx">Backbone</span><span class="p">,</span> <span class="nx">_</span><span class="p">);</span> <span class="p">});</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">&#182;</a> </div> <p>Next for Node.js or CommonJS.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">exports</span> <span class="o">!==</span> <span class="s1">&#39;undefined&#39;</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">_</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;underscore&#39;</span><span class="p">),</span> <span class="nx">Backbone</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;backbone&#39;</span><span class="p">);</span> <span class="nx">factory</span><span class="p">(</span><span class="nx">root</span><span class="p">,</span> <span class="nx">Backbone</span><span class="p">,</span> <span class="nx">_</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">module</span> <span class="o">!==</span> <span class="s1">&#39;undefined&#39;</span> <span class="o">&amp;&amp;</span> <span class="nx">module</span><span class="p">.</span><span class="nx">exports</span><span class="p">)</span> <span class="p">{</span> <span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">;</span> <span class="p">}</span> <span class="nx">exports</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">;</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">&#182;</a> </div> <p>Finally, as a browser global.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="nx">factory</span><span class="p">(</span><span class="nx">root</span><span class="p">,</span> <span class="nx">root</span><span class="p">.</span><span class="nx">Backbone</span><span class="p">,</span> <span class="nx">root</span><span class="p">.</span><span class="nx">_</span><span class="p">);</span> <span class="p">}</span> <span class="p">}(</span><span class="k">this</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">root</span><span class="p">,</span> <span class="nx">Backbone</span><span class="p">,</span> <span class="nx">_</span><span class="p">)</span> <span class="p">{</span> <span class="s2">&quot;use strict&quot;</span><span class="p">;</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-6">&#182;</a> </div> <h2>Initial Setup</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-7">&#182;</a> </div> <p>The top-level namespace. All public Backbone classes and modules will be attached to this. Exported for the browser and CommonJS.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">BackboneModel</span><span class="p">,</span> <span class="nx">BackboneCollection</span><span class="p">,</span> <span class="nx">ModelProto</span><span class="p">,</span> <span class="nx">BackboneEvent</span><span class="p">,</span> <span class="nx">CollectionProto</span><span class="p">,</span> <span class="nx">AssociatedModel</span><span class="p">,</span> <span class="nx">pathChecker</span><span class="p">,</span> <span class="nx">delimiters</span><span class="p">,</span> <span class="nx">pathSeparator</span><span class="p">,</span> <span class="nx">sourceModel</span><span class="p">,</span> <span class="nx">sourceKey</span><span class="p">,</span> <span class="nx">endPoints</span> <span class="o">=</span> <span class="p">{};</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">&#182;</a> </div> <p>Create local reference <code>Model</code> prototype.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">BackboneModel</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">;</span> <span class="nx">BackboneCollection</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Collection</span><span class="p">;</span> <span class="nx">ModelProto</span> <span class="o">=</span> <span class="nx">BackboneModel</span><span class="p">.</span><span class="nx">prototype</span><span class="p">;</span> <span class="nx">CollectionProto</span> <span class="o">=</span> <span class="nx">BackboneCollection</span><span class="p">.</span><span class="nx">prototype</span><span class="p">;</span> <span class="nx">BackboneEvent</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Events</span><span class="p">;</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Associations</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">VERSION</span><span class="o">:</span> <span class="s2">&quot;0.6.2&quot;</span> <span class="p">};</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">&#182;</a> </div> <p>Alternative scopes other than root</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Associations</span><span class="p">.</span><span class="nx">scopes</span> <span class="o">=</span> <span class="p">[];</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">&#182;</a> </div> <p>Define <code>getter</code> and <code>setter</code> for <code>separator</code></p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">getSeparator</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">pathSeparator</span><span class="p">;</span> <span class="p">};</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-11">&#182;</a> </div> <p>Define <code>setSeperator</code></p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">setSeparator</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">_</span><span class="p">.</span><span class="nx">isString</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="o">||</span> <span class="nx">_</span><span class="p">.</span><span class="nx">size</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="nx">value</span> <span class="o">=</span> <span class="s2">&quot;.&quot;</span><span class="p">;</span> <span class="p">}</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-12">&#182;</a> </div> <p>set private properties</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">pathSeparator</span> <span class="o">=</span> <span class="nx">value</span><span class="p">;</span> <span class="nx">pathChecker</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="s2">&quot;[\\&quot;</span> <span class="o">+</span> <span class="nx">pathSeparator</span> <span class="o">+</span> <span class="s2">&quot;\\[\\]]+&quot;</span><span class="p">,</span> <span class="s2">&quot;g&quot;</span><span class="p">);</span> <span class="nx">delimiters</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="s2">&quot;[^\\&quot;</span> <span class="o">+</span> <span class="nx">pathSeparator</span> <span class="o">+</span> <span class="s2">&quot;\\[\\]]+&quot;</span><span class="p">,</span> <span class="s2">&quot;g&quot;</span><span class="p">);</span> <span class="p">};</span> <span class="k">try</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-13">&#182;</a> </div> <p>Define <code>SEPERATOR</code> property to Backbone.Associations</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nb">Object</span><span class="p">.</span><span class="nx">defineProperty</span><span class="p">(</span><span class="nx">Backbone</span><span class="p">.</span><span class="nx">Associations</span><span class="p">,</span> <span class="s1">&#39;SEPARATOR&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">enumerable</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">get</span><span class="o">:</span> <span class="nx">getSeparator</span><span class="p">,</span> <span class="nx">set</span><span class="o">:</span> <span class="nx">setSeparator</span> <span class="p">});</span> <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{}</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">&#182;</a> </div> <h2>Backbone.AssociatedModel</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-15">&#182;</a> </div> <p>Add <code>Many</code> and <code>One</code> relations to Backbone Object.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Associations</span><span class="p">.</span><span class="nx">Many</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Many</span> <span class="o">=</span> <span class="s2">&quot;Many&quot;</span><span class="p">;</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Associations</span><span class="p">.</span><span class="nx">One</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">One</span> <span class="o">=</span> <span class="s2">&quot;One&quot;</span><span class="p">;</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Associations</span><span class="p">.</span><span class="nx">Self</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Self</span> <span class="o">=</span> <span class="s2">&quot;Self&quot;</span><span class="p">;</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-16">&#182;</a> </div> <p>Set default separator</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Associations</span><span class="p">.</span><span class="nx">SEPARATOR</span> <span class="o">=</span> <span class="s2">&quot;.&quot;</span><span class="p">;</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Associations</span><span class="p">.</span><span class="nx">getSeparator</span> <span class="o">=</span> <span class="nx">getSeparator</span><span class="p">;</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Associations</span><span class="p">.</span><span class="nx">setSeparator</span> <span class="o">=</span> <span class="nx">setSeparator</span><span class="p">;</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Associations</span><span class="p">.</span><span class="nx">EVENTS_BUBBLE</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Associations</span><span class="p">.</span><span class="nx">EVENTS_WILDCARD</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Associations</span><span class="p">.</span><span class="nx">EVENTS_NC</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span> <span class="nx">setSeparator</span><span class="p">();</span></pre></div> </td> </tr> <tr id="section-17"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-17">&#182;</a> </div> <p>Define <code>AssociatedModel</code> (Extends Backbone.Model).</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">AssociatedModel</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">AssociatedModel</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Associations</span><span class="p">.</span><span class="nx">AssociatedModel</span> <span class="o">=</span> <span class="nx">BackboneModel</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span></pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-18">&#182;</a> </div> <p>Define relations with Associated Model.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">relations</span><span class="o">:</span><span class="kc">undefined</span><span class="p">,</span></pre></div> </td> </tr> <tr id="section-19"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-19">&#182;</a> </div> <p>Define <code>Model</code> property which can keep track of already fired <code>events</code>, and prevent redundant event to be triggered in case of cyclic model graphs.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">_proxyCalls</span><span class="o">:</span><span class="kc">undefined</span><span class="p">,</span></pre></div> </td> </tr> <tr id="section-20"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-20">&#182;</a> </div> <p>Override constructor to set parents</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">constructor</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">attributes</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-21"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-21">&#182;</a> </div> <p>Set parent's opportunistically.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">options</span> <span class="o">&amp;&amp;</span> <span class="nx">options</span><span class="p">.</span><span class="nx">__parents__</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">parents</span> <span class="o">=</span> <span class="p">[</span><span class="nx">options</span><span class="p">.</span><span class="nx">__parents__</span><span class="p">]);</span> <span class="nx">BackboneModel</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span> <span class="p">},</span> <span class="nx">on</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">callback</span><span class="p">,</span> <span class="nx">context</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">result</span> <span class="o">=</span> <span class="nx">BackboneEvent</span><span class="p">.</span><span class="nx">on</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span></pre></div> </td> </tr> <tr id="section-22"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-22">&#182;</a> </div> <p>No optimization possible if nested-events is wanted by the application</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span> <span class="p">(</span><span class="nx">Backbone</span><span class="p">.</span><span class="nx">Associations</span><span class="p">.</span><span class="nx">EVENTS_NC</span><span class="p">)</span> <span class="k">return</span> <span class="nx">result</span><span class="p">;</span></pre></div> </td> </tr> <tr id="section-23"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-23">&#182;</a> </div> <p>Regular expression used to split event strings.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">eventSplitter</span> <span class="o">=</span> <span class="sr">/\s+/</span><span class="p">;</span></pre></div> </td> </tr> <tr id="section-24"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-24">&#182;</a> </div> <p>Handle atomic event names only</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span> <span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">isString</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="nx">name</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="o">!</span><span class="nx">eventSplitter</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">name</span><span class="p">))</span> <span class="o">&amp;&amp;</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">endPoint</span> <span class="o">=</span> <span class="nx">getPathEndPoint</span><span class="p">(</span><span class="nx">name</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="nx">endPoint</span><span class="p">)</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-25"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-25">&#182;</a> </div> <p>Increment end point counter. Represents # of nodes which listen to this end point</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">endPoints</span><span class="p">[</span><span class="nx">endPoint</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">endPoints</span><span class="p">[</span><span class="nx">endPoint</span><span class="p">]</span> <span class="o">===</span> <span class="s1">&#39;undefined&#39;</span><span class="p">)</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="p">(</span><span class="nx">endPoints</span><span class="p">[</span><span class="nx">endPoint</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="nx">result</span><span class="p">;</span> <span class="p">},</span> <span class="nx">off</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">callback</span><span class="p">,</span> <span class="nx">context</span><span class="p">)</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-26"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-26">&#182;</a> </div> <p>No optimization possible if nested-events is wanted by the application</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span> <span class="p">(</span><span class="nx">Backbone</span><span class="p">.</span><span class="nx">Associations</span><span class="p">.</span><span class="nx">EVENTS_NC</span><span class="p">)</span> <span class="k">return</span> <span class="nx">BackboneEvent</span><span class="p">.</span><span class="nx">off</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span> <span class="kd">var</span> <span class="nx">eventSplitter</span> <span class="o">=</span> <span class="sr">/\s+/</span><span class="p">,</span> <span class="nx">events</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_events</span><span class="p">,</span> <span class="nx">listeners</span> <span class="o">=</span> <span class="p">{},</span> <span class="nx">names</span> <span class="o">=</span> <span class="nx">events</span> <span class="o">?</span> <span class="nx">_</span><span class="p">.</span><span class="nx">keys</span><span class="p">(</span><span class="nx">events</span><span class="p">)</span> <span class="o">:</span> <span class="p">[],</span> <span class="nx">all</span> <span class="o">=</span> <span class="p">(</span><span class="o">!</span><span class="nx">name</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">callback</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">context</span><span class="p">),</span> <span class="nx">atomic_event</span> <span class="o">=</span> <span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">isString</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="o">!</span><span class="nx">eventSplitter</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">name</span><span class="p">)));</span> <span class="k">if</span> <span class="p">(</span><span class="nx">all</span> <span class="o">||</span> <span class="nx">atomic_event</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">names</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-27"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-27">&#182;</a> </div> <p>Store the # of callbacks listening to the event name prior to the <code>off</code> call</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">listeners</span><span class="p">[</span><span class="nx">names</span><span class="p">[</span><span class="nx">i</span><span class="p">]]</span> <span class="o">=</span> <span class="nx">events</span><span class="p">[</span><span class="nx">names</span><span class="p">[</span><span class="nx">i</span><span class="p">]]</span> <span class="o">?</span> <span class="nx">events</span><span class="p">[</span><span class="nx">names</span><span class="p">[</span><span class="nx">i</span><span class="p">]].</span><span class="nx">length</span> <span class="o">:</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span></pre></div> </td> </tr> <tr id="section-28"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-28">&#182;</a> </div> <p>Call Backbone off implementation</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">result</span> <span class="o">=</span> <span class="nx">BackboneEvent</span><span class="p">.</span><span class="nx">off</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="nx">all</span> <span class="o">||</span> <span class="nx">atomic_event</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">names</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">endPoint</span> <span class="o">=</span> <span class="nx">getPathEndPoint</span><span class="p">(</span><span class="nx">names</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span> <span class="k">if</span> <span class="p">(</span><span class="nx">endPoint</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">events</span><span class="p">[</span><span class="nx">names</span><span class="p">[</span><span class="nx">i</span><span class="p">]])</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-29"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-29">&#182;</a> </div> <p>Some listeners wiped out for this name for this object</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">endPoints</span><span class="p">[</span><span class="nx">endPoint</span><span class="p">]</span> <span class="o">-=</span> <span class="p">(</span><span class="nx">listeners</span><span class="p">[</span><span class="nx">names</span><span class="p">[</span><span class="nx">i</span><span class="p">]]</span> <span class="o">-</span> <span class="nx">events</span><span class="p">[</span><span class="nx">names</span><span class="p">[</span><span class="nx">i</span><span class="p">]].</span><span class="nx">length</span><span class="p">);</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-30"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-30">&#182;</a> </div> <p>All listeners wiped out for this name for this object</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">endPoints</span><span class="p">[</span><span class="nx">endPoint</span><span class="p">]</span> <span class="o">-=</span> <span class="nx">listeners</span><span class="p">[</span><span class="nx">names</span><span class="p">[</span><span class="nx">i</span><span class="p">]];</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="nx">result</span><span class="p">;</span> <span class="p">},</span></pre></div> </td> </tr> <tr id="section-31"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-31">&#182;</a> </div> <p>Get the value of an attribute.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">get</span><span class="o">:</span><span class="kd">function</span> <span class="p">(</span><span class="nx">attr</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">cache</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">__attributes__</span><span class="p">,</span> <span class="nx">val</span> <span class="o">=</span> <span class="nx">ModelProto</span><span class="p">.</span><span class="nx">get</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">attr</span><span class="p">),</span> <span class="nx">obj</span> <span class="o">=</span> <span class="nx">cache</span> <span class="o">?</span> <span class="p">(</span><span class="nx">isValuePresent</span><span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="o">?</span> <span class="nx">val</span> <span class="o">:</span> <span class="nx">cache</span><span class="p">[</span><span class="nx">attr</span><span class="p">])</span> <span class="o">:</span> <span class="nx">val</span><span class="p">;</span> <span class="k">return</span> <span class="nx">isValuePresent</span><span class="p">(</span><span class="nx">obj</span><span class="p">)</span> <span class="o">?</span> <span class="nx">obj</span> <span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">_getAttr</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span> <span class="p">},</span></pre></div> </td> </tr> <tr id="section-32"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-32">&#182;</a> </div> <p>Set a hash of model attributes on the Backbone Model.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">set</span><span class="o">:</span><span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">attributes</span><span class="p">,</span> <span class="nx">result</span><span class="p">;</span></pre></div> </td> </tr> <tr id="section-33"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-33">&#182;</a> </div> <p>Duplicate backbone's behavior to allow separate key/value parameters, instead of a single 'attributes' object.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span> <span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">isObject</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="o">||</span> <span class="nx">key</span> <span class="o">==</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span> <span class="nx">attributes</span> <span class="o">=</span> <span class="nx">key</span><span class="p">;</span> <span class="nx">options</span> <span class="o">=</span> <span class="nx">value</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="nx">attributes</span> <span class="o">=</span> <span class="p">{};</span> <span class="nx">attributes</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">value</span><span class="p">;</span> <span class="p">}</span> <span class="nx">result</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_set</span><span class="p">(</span><span class="nx">attributes</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span></pre></div> </td> </tr> <tr id="section-34"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-34">&#182;</a> </div> <p>Trigger events which have been blocked until the entire object graph is updated.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">this</span><span class="p">.</span><span class="nx">_processPendingEvents</span><span class="p">();</span> <span class="k">return</span> <span class="nx">result</span><span class="p">;</span> <span class="p">},</span></pre></div> </td> </tr> <tr id="section-35"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-35">&#182;</a> </div> <p>Works with an attribute hash and options + fully qualified paths</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">_set</span><span class="o">:</span><span class="kd">function</span> <span class="p">(</span><span class="nx">attributes</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">attr</span><span class="p">,</span> <span class="nx">modelMap</span><span class="p">,</span> <span class="nx">modelId</span><span class="p">,</span> <span class="nx">obj</span><span class="p">,</span> <span class="nx">result</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">attributes</span><span class="p">)</span> <span class="k">return</span> <span class="k">this</span><span class="p">;</span></pre></div> </td> </tr> <tr id="section-36"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-36">&#182;</a> </div> <p>temp cache of attributes</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">this</span><span class="p">.</span><span class="nx">__attributes__</span> <span class="o">=</span> <span class="nx">attributes</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="nx">attr</span> <span class="k">in</span> <span class="nx">attributes</span><span class="p">)</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-37"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-37">&#182;</a> </div> <p>Create a map for each unique object whose attributes we want to set</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">modelMap</span> <span class="o">||</span> <span class="p">(</span><span class="nx">modelMap</span> <span class="o">=</span> <span class="p">{});</span> <span class="k">if</span> <span class="p">(</span><span class="nx">attr</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">pathChecker</span><span class="p">))</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">pathTokens</span> <span class="o">=</span> <span class="nx">getPathArray</span><span class="p">(</span><span class="nx">attr</span><span class="p">),</span> <span class="nx">initials</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">initial</span><span class="p">(</span><span class="nx">pathTokens</span><span class="p">),</span> <span class="nx">last</span> <span class="o">=</span> <span class="nx">pathTokens</span><span class="p">[</span><span class="nx">pathTokens</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">],</span> <span class="nx">parentModel</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">initials</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="nx">parentModel</span> <span class="k">instanceof</span> <span class="nx">BackboneModel</span><span class="p">)</span> <span class="p">{</span> <span class="nx">obj</span> <span class="o">=</span> <span class="nx">modelMap</span><span class="p">[</span><span class="nx">parentModel</span><span class="p">.</span><span class="nx">cid</span><span class="p">]</span> <span class="o">||</span> <span class="p">(</span><span class="nx">modelMap</span><span class="p">[</span><span class="nx">parentModel</span><span class="p">.</span><span class="nx">cid</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;model&#39;</span><span class="o">:</span> <span class="nx">parentModel</span><span class="p">,</span> <span class="s1">&#39;data&#39;</span><span class="o">:</span> <span class="p">{}});</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">last</span><span class="p">]</span> <span class="o">=</span> <span class="nx">attributes</span><span class="p">[</span><span class="nx">attr</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="nx">obj</span> <span class="o">=</span> <span class="nx">modelMap</span><span class="p">[</span><span class="k">this</span><span class="p">.</span><span class="nx">cid</span><span class="p">]</span> <span class="o">||</span> <span class="p">(</span><span class="nx">modelMap</span><span class="p">[</span><span class="k">this</span><span class="p">.</span><span class="nx">cid</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;model&#39;</span><span class="o">:</span><span class="k">this</span><span class="p">,</span> <span class="s1">&#39;data&#39;</span><span class="o">:</span><span class="p">{}});</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">attr</span><span class="p">]</span> <span class="o">=</span> <span class="nx">attributes</span><span class="p">[</span><span class="nx">attr</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="k">if</span> <span class="p">(</span><span class="nx">modelMap</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="nx">modelId</span> <span class="k">in</span> <span class="nx">modelMap</span><span class="p">)</span> <span class="p">{</span> <span class="nx">obj</span> <span class="o">=</span> <span class="nx">modelMap</span><span class="p">[</span><span class="nx">modelId</span><span class="p">];</span> <span class="k">this</span><span class="p">.</span><span class="nx">_setAttr</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">obj</span><span class="p">.</span><span class="nx">model</span><span class="p">,</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">data</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="nx">result</span> <span class="o