PageRenderTime 62ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/docs/base-collection.html

https://bitbucket.org/madebybottle/bottlecap
HTML | 382 lines | 268 code | 114 blank | 0 comment | 0 complexity | 3fcb67328cc3ad046aaa7fe4192ea172 MD5 | raw file
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>base-collection.js</title>
  5. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  6. <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
  7. <link rel="stylesheet" media="all" href="docco.css" />
  8. </head>
  9. <body>
  10. <div id="container">
  11. <div id="background"></div>
  12. <ul id="jump_to">
  13. <li>
  14. <a class="large" href="javascript:void(0);">Jump To &hellip;</a>
  15. <a class="small" href="javascript:void(0);">+</a>
  16. <div id="jump_wrapper">
  17. <div id="jump_page">
  18. <a class="source" href="base-collection.html">
  19. base-collection.js
  20. </a>
  21. <a class="source" href="filter-collection.html">
  22. filter-collection.js
  23. </a>
  24. <a class="source" href="live-collection.html">
  25. live-collection.js
  26. </a>
  27. <a class="source" href="base-controller.html">
  28. base-controller.js
  29. </a>
  30. <a class="source" href="data-bindings.html">
  31. data-bindings.js
  32. </a>
  33. <a class="source" href="base-model.html">
  34. base-model.js
  35. </a>
  36. <a class="source" href="base-module.html">
  37. base-module.js
  38. </a>
  39. <a class="source" href="base-router.html">
  40. base-router.js
  41. </a>
  42. <a class="source" href="base-view.html">
  43. base-view.js
  44. </a>
  45. <a class="source" href="collection-view.html">
  46. collection-view.js
  47. </a>
  48. <a class="source" href="model-view.html">
  49. model-view.js
  50. </a>
  51. </div>
  52. </li>
  53. </ul>
  54. <ul class="sections">
  55. <li id="title">
  56. <div class="annotation">
  57. <h1>base-collection.js</h1>
  58. </div>
  59. </li>
  60. <li id="section-1">
  61. <div class="annotation">
  62. <div class="pilwrap ">
  63. <a class="pilcrow" href="#section-1">&#182;</a>
  64. </div>
  65. </div>
  66. <div class="content"><div class='highlight'><pre>module.exports = <span class="keyword">function</span>(options) {</pre></div></div>
  67. </li>
  68. <li id="section-2">
  69. <div class="annotation">
  70. <div class="pilwrap for-h2">
  71. <a class="pilcrow" href="#section-2">&#182;</a>
  72. </div>
  73. <h2>BaseCollection</h2>
  74. <hr>
  75. </div>
  76. </li>
  77. <li id="section-3">
  78. <div class="annotation">
  79. <div class="pilwrap ">
  80. <a class="pilcrow" href="#section-3">&#182;</a>
  81. </div>
  82. <p>The BaseCollection is the base Collection for storing instances of models
  83. for Bottlecap. It is the same as a normal Backbone.Collection, but with
  84. a few alterations:</p>
  85. <ul>
  86. <li>It keeps a reference to the event bus upon construction</li>
  87. <li>It can reply to DataStore API requests on that event bus, if a
  88. namespace option is passed to it.</li>
  89. </ul>
  90. <h3>Dependencies</h3>
  91. <hr>
  92. </div>
  93. </li>
  94. <li id="section-4">
  95. <div class="annotation">
  96. <div class="pilwrap ">
  97. <a class="pilcrow" href="#section-4">&#182;</a>
  98. </div>
  99. </div>
  100. <div class="content"><div class='highlight'><pre> <span class="keyword">var</span> Backbone = options.Backbone;
  101. <span class="keyword">var</span> _ = options._;
  102. <span class="keyword">var</span> FilterCollection = options.FilterCollection;</pre></div></div>
  103. </li>
  104. <li id="section-5">
  105. <div class="annotation">
  106. <div class="pilwrap for-h3">
  107. <a class="pilcrow" href="#section-5">&#182;</a>
  108. </div>
  109. <h3>BaseCollection</h3>
  110. <hr>
  111. </div>
  112. </li>
  113. <li id="section-6">
  114. <div class="annotation">
  115. <div class="pilwrap ">
  116. <a class="pilcrow" href="#section-6">&#182;</a>
  117. </div>
  118. </div>
  119. <div class="content"><div class='highlight'><pre> <span class="keyword">var</span> BaseCollection = Backbone.Collection.extend({</pre></div></div>
  120. </li>
  121. <li id="section-7">
  122. <div class="annotation">
  123. <div class="pilwrap ">
  124. <a class="pilcrow" href="#section-7">&#182;</a>
  125. </div>
  126. <p>The DataStore API events</p>
  127. </div>
  128. <div class="content"><div class='highlight'><pre> dataStoreAPI: [
  129. <span class="string">'all'</span>, <span class="string">'find'</span>, <span class="string">'where'</span>, <span class="string">'filter'</span>, <span class="string">'build'</span>
  130. ],</pre></div></div>
  131. </li>
  132. <li id="section-8">
  133. <div class="annotation">
  134. <div class="pilwrap ">
  135. <a class="pilcrow" href="#section-8">&#182;</a>
  136. </div>
  137. <p>Creates a BaseCollection and returns it. Accepts <code>models</code>, and
  138. <code>options</code> parameters. The <code>options</code> parameter should contain an
  139. instance of the application event bus. If you want this BaseCollection
  140. to be able to respond to DataStore API requests on the event bus, you
  141. should also pass a <code>namespace</code> property on the <code>options</code> object.</p>
  142. </div>
  143. <div class="content"><div class='highlight'><pre> constructor: <span class="keyword">function</span>(models, options) {
  144. Backbone.Collection.apply(<span class="keyword">this</span>, arguments);
  145. models = models || [];
  146. options = options || {};
  147. <span class="keyword">this</span>._vent = options.vent;
  148. <span class="keyword">if</span> (!<span class="keyword">this</span>.namespace) {
  149. <span class="keyword">this</span>.namespace = options.namespace;
  150. }
  151. <span class="keyword">if</span> (<span class="keyword">this</span>.namespace) {
  152. <span class="keyword">var</span> locals = _.map(<span class="keyword">this</span>.dataStoreAPI, <span class="keyword">function</span>(name) {
  153. <span class="keyword">return</span> <span class="string">'_'</span> + name;
  154. });
  155. _.bindAll(<span class="keyword">this</span>, locals);
  156. <span class="keyword">this</span>._setupDSBindings(<span class="keyword">this</span>.namespace, <span class="keyword">this</span>.dataStoreAPI);
  157. }
  158. <span class="keyword">return</span> <span class="keyword">this</span>;
  159. },</pre></div></div>
  160. </li>
  161. <li id="section-9">
  162. <div class="annotation">
  163. <div class="pilwrap for-h3">
  164. <a class="pilcrow" href="#section-9">&#182;</a>
  165. </div>
  166. <h3>DataStore API functions</h3>
  167. </div>
  168. <div class="content"><div class='highlight'><pre> _subcollection: <span class="keyword">function</span>(options) {
  169. <span class="keyword">var</span> col = <span class="keyword">new</span> FilterCollection({
  170. filter: options.filter,
  171. parent: <span class="keyword">this</span>
  172. });
  173. <span class="keyword">return</span> col;
  174. },
  175. _build: <span class="keyword">function</span>(attrs, options, cb) {
  176. <span class="keyword">var</span> args = Array.prototype.slice.call(arguments);
  177. <span class="keyword">if</span> (args.length === <span class="number">1</span>) {
  178. cb = args[<span class="number">0</span>];
  179. attrs = {};
  180. options = {};
  181. } <span class="keyword">else</span> <span class="keyword">if</span> (args.length === <span class="number">2</span>) {
  182. attrs = args[<span class="number">0</span>];
  183. options = {};
  184. cb = args[<span class="number">1</span>];
  185. }
  186. <span class="keyword">var</span> model = <span class="keyword">new</span> <span class="keyword">this</span>.model(attrs, options);
  187. <span class="keyword">return</span> cb (<span class="literal">null</span>, model);
  188. },
  189. _all: <span class="keyword">function</span>(cb) {
  190. <span class="keyword">var</span> filter = <span class="keyword">function</span>(model) { <span class="keyword">return</span> <span class="literal">true</span>; };
  191. <span class="keyword">var</span> all = <span class="keyword">this</span>._subcollection({filter: filter});
  192. <span class="keyword">return</span> cb(<span class="literal">null</span>, all);
  193. },
  194. _find: <span class="keyword">function</span>(attrs, cb) {
  195. <span class="keyword">this</span>._where(attrs, <span class="keyword">function</span>(err, data) {
  196. <span class="keyword">if</span> (err) { <span class="keyword">return</span> cb(err); }
  197. <span class="keyword">if</span> (data.length &lt; <span class="number">1</span>) {
  198. err = <span class="keyword">new</span> Error(<span class="string">'DSNotFoundError'</span>);
  199. <span class="keyword">return</span> cb(err);
  200. }
  201. <span class="keyword">var</span> model = data.at(<span class="number">0</span>);
  202. <span class="keyword">return</span> cb(<span class="literal">null</span>, model);
  203. });
  204. },
  205. _where: <span class="keyword">function</span>(attrs, cb) {
  206. <span class="keyword">var</span> filter = <span class="keyword">function</span>(model) {
  207. <span class="keyword">for</span> (<span class="keyword">var</span> key <span class="keyword">in</span> attrs) {
  208. <span class="keyword">var</span> modelValue = model.get(key);
  209. <span class="keyword">var</span> value = attrs[key];
  210. <span class="keyword">if</span> ((value <span class="keyword">instanceof</span> Array) &amp;&amp; (modelValue <span class="keyword">instanceof</span> Array)) {
  211. <span class="keyword">if</span> (value !== modelValue) { <span class="keyword">return</span> <span class="literal">false</span>; }
  212. } <span class="keyword">else</span> <span class="keyword">if</span> (value <span class="keyword">instanceof</span> Array) {
  213. <span class="keyword">if</span> (!_.contains(value, modelValue)) { <span class="keyword">return</span> <span class="literal">false</span>; }
  214. } <span class="keyword">else</span> <span class="keyword">if</span> (modelValue <span class="keyword">instanceof</span> Array) {
  215. <span class="keyword">if</span> (!_.contains(modelValue, value)) { <span class="keyword">return</span> <span class="literal">false</span>; }
  216. } <span class="keyword">else</span> {
  217. <span class="keyword">if</span> (modelValue !== value) { <span class="keyword">return</span> <span class="literal">false</span>; }
  218. }
  219. }
  220. <span class="keyword">return</span> <span class="literal">true</span>;
  221. };
  222. <span class="keyword">var</span> col = <span class="keyword">this</span>._subcollection({filter: filter});
  223. <span class="keyword">return</span> cb(<span class="literal">null</span>, col);
  224. },
  225. _filter: <span class="keyword">function</span>(filter, cb) {
  226. <span class="keyword">var</span> col = <span class="keyword">this</span>._subcollection({filter: filter});
  227. <span class="keyword">return</span> cb(<span class="literal">null</span>, col);
  228. },</pre></div></div>
  229. </li>
  230. <li id="section-10">
  231. <div class="annotation">
  232. <div class="pilwrap ">
  233. <a class="pilcrow" href="#section-10">&#182;</a>
  234. </div>
  235. <p>Binds DataStore API message names to functions on this instance. For
  236. example, ds:contacts:all -&gt; this._all</p>
  237. </div>
  238. <div class="content"><div class='highlight'><pre> _setupDSBindings: <span class="keyword">function</span>(namespace, dsEvents) {
  239. _.each(dsEvents, <span class="keyword">function</span>(name) {
  240. <span class="keyword">var</span> messageName = <span class="string">'ds:'</span> + namespace + <span class="string">':'</span> + name;
  241. <span class="keyword">var</span> ourFunc = <span class="keyword">this</span>[<span class="string">'_'</span> + name];
  242. <span class="keyword">this</span>._vent.handle(messageName, ourFunc);
  243. }, <span class="keyword">this</span>);
  244. }
  245. });</pre></div></div>
  246. </li>
  247. <li id="section-11">
  248. <div class="annotation">
  249. <div class="pilwrap for-h3">
  250. <a class="pilcrow" href="#section-11">&#182;</a>
  251. </div>
  252. <h3>Exports</h3>
  253. <hr>
  254. </div>
  255. </li>
  256. <li id="section-12">
  257. <div class="annotation">
  258. <div class="pilwrap ">
  259. <a class="pilcrow" href="#section-12">&#182;</a>
  260. </div>
  261. </div>
  262. <div class="content"><div class='highlight'><pre> <span class="keyword">return</span> BaseCollection;
  263. };</pre></div></div>
  264. </li>
  265. </ul>
  266. </div>
  267. </body>
  268. </html>