PageRenderTime 57ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/bower_components/backbone/docs/backbone.localstorage.html

https://github.com/robertd/benm
HTML | 438 lines | 310 code | 128 blank | 0 comment | 0 complexity | 907663343df468166d9ce721e7457fb5 MD5 | raw file
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>backbone.localstorage.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="backbone.localstorage.html">
  19. backbone.localstorage.js
  20. </a>
  21. <a class="source" href="todos.html">
  22. todos.js
  23. </a>
  24. </div>
  25. </li>
  26. </ul>
  27. <ul class="sections">
  28. <li id="title">
  29. <div class="annotation">
  30. <h1>backbone.localstorage.js</h1>
  31. </div>
  32. </li>
  33. <li id="section-1">
  34. <div class="annotation">
  35. <div class="pilwrap ">
  36. <a class="pilcrow" href="#section-1">&#182;</a>
  37. </div>
  38. </div>
  39. <div class="content"><div class='highlight'><pre><span class="comment">/**
  40. * Backbone localStorage Adapter
  41. * Version 1.1.0
  42. *
  43. * https://github.com/jeromegn/Backbone.localStorage
  44. */</span>
  45. (<span class="function"><span class="keyword">function</span> <span class="params">(root, factory)</span> {</span>
  46. <span class="keyword">if</span> (<span class="keyword">typeof</span> define === <span class="string">"function"</span> &amp;&amp; define.amd) {</pre></div></div>
  47. </li>
  48. <li id="section-2">
  49. <div class="annotation">
  50. <div class="pilwrap ">
  51. <a class="pilcrow" href="#section-2">&#182;</a>
  52. </div>
  53. <p>AMD. Register as an anonymous module.</p>
  54. </div>
  55. <div class="content"><div class='highlight'><pre> define([<span class="string">"underscore"</span>,<span class="string">"backbone"</span>], <span class="keyword">function</span>(_, Backbone) {</pre></div></div>
  56. </li>
  57. <li id="section-3">
  58. <div class="annotation">
  59. <div class="pilwrap ">
  60. <a class="pilcrow" href="#section-3">&#182;</a>
  61. </div>
  62. <p>Use global variables if the locals are undefined.</p>
  63. </div>
  64. <div class="content"><div class='highlight'><pre> <span class="keyword">return</span> factory(_ || root._, Backbone || root.Backbone);
  65. });
  66. } <span class="keyword">else</span> {</pre></div></div>
  67. </li>
  68. <li id="section-4">
  69. <div class="annotation">
  70. <div class="pilwrap ">
  71. <a class="pilcrow" href="#section-4">&#182;</a>
  72. </div>
  73. <p>RequireJS isn&#39;t being used. Assume underscore and backbone are loaded in <script> tags</p>
  74. </div>
  75. <div class="content"><div class='highlight'><pre> factory(_, Backbone);
  76. }
  77. }(<span class="keyword">this</span>, <span class="keyword">function</span>(_, Backbone) {</pre></div></div>
  78. </li>
  79. <li id="section-5">
  80. <div class="annotation">
  81. <div class="pilwrap ">
  82. <a class="pilcrow" href="#section-5">&#182;</a>
  83. </div>
  84. <p>A simple module to replace <code>Backbone.sync</code> with <em>localStorage</em>-based
  85. persistence. Models are given GUIDS, and saved into a JSON object. Simple
  86. as that.</p>
  87. <p>Hold reference to Underscore.js and Backbone.js in the closure in order
  88. to make things work even if they are removed from the global namespace</p>
  89. <p>Generate four random hex digits.</p>
  90. </div>
  91. <div class="content"><div class='highlight'><pre><span class="function"><span class="keyword">function</span> <span class="title">S4</span><span class="params">()</span> {</span>
  92. <span class="keyword">return</span> (((<span class="number">1</span>+Math.random())*<span class="number">0x10000</span>)|<span class="number">0</span>).toString(<span class="number">16</span>).substring(<span class="number">1</span>);
  93. };</pre></div></div>
  94. </li>
  95. <li id="section-6">
  96. <div class="annotation">
  97. <div class="pilwrap ">
  98. <a class="pilcrow" href="#section-6">&#182;</a>
  99. </div>
  100. <p>Generate a pseudo-GUID by concatenating random hexadecimal.</p>
  101. </div>
  102. <div class="content"><div class='highlight'><pre><span class="function"><span class="keyword">function</span> <span class="title">guid</span><span class="params">()</span> {</span>
  103. <span class="keyword">return</span> (S4()+S4()+<span class="string">"-"</span>+S4()+<span class="string">"-"</span>+S4()+<span class="string">"-"</span>+S4()+<span class="string">"-"</span>+S4()+S4()+S4());
  104. };</pre></div></div>
  105. </li>
  106. <li id="section-7">
  107. <div class="annotation">
  108. <div class="pilwrap ">
  109. <a class="pilcrow" href="#section-7">&#182;</a>
  110. </div>
  111. <p>Our Store is represented by a single JS object in <em>localStorage</em>. Create it
  112. with a meaningful name, like the name you&#39;d give a table.
  113. window.Store is deprectated, use Backbone.LocalStorage instead</p>
  114. </div>
  115. <div class="content"><div class='highlight'><pre>Backbone.LocalStorage = window.Store = <span class="keyword">function</span>(name) {
  116. <span class="keyword">this</span>.name = name;
  117. <span class="keyword">var</span> store = <span class="keyword">this</span>.localStorage().getItem(<span class="keyword">this</span>.name);
  118. <span class="keyword">this</span>.records = (store &amp;&amp; store.split(<span class="string">","</span>)) || [];
  119. };
  120. _.extend(Backbone.LocalStorage.prototype, {</pre></div></div>
  121. </li>
  122. <li id="section-8">
  123. <div class="annotation">
  124. <div class="pilwrap ">
  125. <a class="pilcrow" href="#section-8">&#182;</a>
  126. </div>
  127. <p>Save the current state of the <strong>Store</strong> to <em>localStorage</em>.</p>
  128. </div>
  129. <div class="content"><div class='highlight'><pre> save: <span class="keyword">function</span>() {
  130. <span class="keyword">this</span>.localStorage().setItem(<span class="keyword">this</span>.name, <span class="keyword">this</span>.records.join(<span class="string">","</span>));
  131. },</pre></div></div>
  132. </li>
  133. <li id="section-9">
  134. <div class="annotation">
  135. <div class="pilwrap ">
  136. <a class="pilcrow" href="#section-9">&#182;</a>
  137. </div>
  138. <p>Add a model, giving it a (hopefully)-unique GUID, if it doesn&#39;t already
  139. have an id of it&#39;s own.</p>
  140. </div>
  141. <div class="content"><div class='highlight'><pre> create: <span class="keyword">function</span>(model) {
  142. <span class="keyword">if</span> (!model.id) {
  143. model.id = guid();
  144. model.set(model.idAttribute, model.id);
  145. }
  146. <span class="keyword">this</span>.localStorage().setItem(<span class="keyword">this</span>.name+<span class="string">"-"</span>+model.id, JSON.stringify(model));
  147. <span class="keyword">this</span>.records.push(model.id.toString());
  148. <span class="keyword">this</span>.save();
  149. <span class="keyword">return</span> <span class="keyword">this</span>.find(model);
  150. },</pre></div></div>
  151. </li>
  152. <li id="section-10">
  153. <div class="annotation">
  154. <div class="pilwrap ">
  155. <a class="pilcrow" href="#section-10">&#182;</a>
  156. </div>
  157. <p>Update a model by replacing its copy in <code>this.data</code>.</p>
  158. </div>
  159. <div class="content"><div class='highlight'><pre> update: <span class="keyword">function</span>(model) {
  160. <span class="keyword">this</span>.localStorage().setItem(<span class="keyword">this</span>.name+<span class="string">"-"</span>+model.id, JSON.stringify(model));
  161. <span class="keyword">if</span> (!_.include(<span class="keyword">this</span>.records, model.id.toString()))
  162. <span class="keyword">this</span>.records.push(model.id.toString()); <span class="keyword">this</span>.save();
  163. <span class="keyword">return</span> <span class="keyword">this</span>.find(model);
  164. },</pre></div></div>
  165. </li>
  166. <li id="section-11">
  167. <div class="annotation">
  168. <div class="pilwrap ">
  169. <a class="pilcrow" href="#section-11">&#182;</a>
  170. </div>
  171. <p>Retrieve a model from <code>this.data</code> by id.</p>
  172. </div>
  173. <div class="content"><div class='highlight'><pre> find: <span class="keyword">function</span>(model) {
  174. <span class="keyword">return</span> <span class="keyword">this</span>.jsonData(<span class="keyword">this</span>.localStorage().getItem(<span class="keyword">this</span>.name+<span class="string">"-"</span>+model.id));
  175. },</pre></div></div>
  176. </li>
  177. <li id="section-12">
  178. <div class="annotation">
  179. <div class="pilwrap ">
  180. <a class="pilcrow" href="#section-12">&#182;</a>
  181. </div>
  182. <p>Return the array of all models currently in storage.</p>
  183. </div>
  184. <div class="content"><div class='highlight'><pre> findAll: <span class="keyword">function</span>() {
  185. <span class="keyword">return</span> _(<span class="keyword">this</span>.records).chain()
  186. .map(<span class="keyword">function</span>(id){
  187. <span class="keyword">return</span> <span class="keyword">this</span>.jsonData(<span class="keyword">this</span>.localStorage().getItem(<span class="keyword">this</span>.name+<span class="string">"-"</span>+id));
  188. }, <span class="keyword">this</span>)
  189. .compact()
  190. .value();
  191. },</pre></div></div>
  192. </li>
  193. <li id="section-13">
  194. <div class="annotation">
  195. <div class="pilwrap ">
  196. <a class="pilcrow" href="#section-13">&#182;</a>
  197. </div>
  198. <p>Delete a model from <code>this.data</code>, returning it.</p>
  199. </div>
  200. <div class="content"><div class='highlight'><pre> destroy: <span class="keyword">function</span>(model) {
  201. <span class="keyword">if</span> (model.isNew())
  202. <span class="keyword">return</span> <span class="literal">false</span>
  203. <span class="keyword">this</span>.localStorage().removeItem(<span class="keyword">this</span>.name+<span class="string">"-"</span>+model.id);
  204. <span class="keyword">this</span>.records = _.reject(<span class="keyword">this</span>.records, <span class="keyword">function</span>(id){
  205. <span class="keyword">return</span> id === model.id.toString();
  206. });
  207. <span class="keyword">this</span>.save();
  208. <span class="keyword">return</span> model;
  209. },
  210. localStorage: <span class="keyword">function</span>() {
  211. <span class="keyword">return</span> localStorage;
  212. },</pre></div></div>
  213. </li>
  214. <li id="section-14">
  215. <div class="annotation">
  216. <div class="pilwrap ">
  217. <a class="pilcrow" href="#section-14">&#182;</a>
  218. </div>
  219. <p>fix for &quot;illegal access&quot; error on Android when JSON.parse is passed null</p>
  220. </div>
  221. <div class="content"><div class='highlight'><pre> jsonData: <span class="function"><span class="keyword">function</span> <span class="params">(data)</span> {</span>
  222. <span class="keyword">return</span> data &amp;&amp; JSON.parse(data);
  223. }
  224. });</pre></div></div>
  225. </li>
  226. <li id="section-15">
  227. <div class="annotation">
  228. <div class="pilwrap ">
  229. <a class="pilcrow" href="#section-15">&#182;</a>
  230. </div>
  231. <p>localSync delegate to the model or collection&#39;s
  232. <em>localStorage</em> property, which should be an instance of <code>Store</code>.
  233. window.Store.sync and Backbone.localSync is deprectated, use Backbone.LocalStorage.sync instead</p>
  234. </div>
  235. <div class="content"><div class='highlight'><pre>Backbone.LocalStorage.sync = window.Store.sync = Backbone.localSync = <span class="keyword">function</span>(method, model, options) {
  236. <span class="keyword">var</span> store = model.localStorage || model.collection.localStorage;
  237. <span class="keyword">var</span> resp, errorMessage, syncDfd = $.Deferred &amp;&amp; $.Deferred(); <span class="comment">//If $ is having Deferred - use it.</span>
  238. <span class="keyword">try</span> {
  239. <span class="keyword">switch</span> (method) {
  240. <span class="keyword">case</span> <span class="string">"read"</span>:
  241. resp = model.id != <span class="literal">undefined</span> ? store.find(model) : store.findAll();
  242. <span class="keyword">break</span>;
  243. <span class="keyword">case</span> <span class="string">"create"</span>:
  244. resp = store.create(model);
  245. <span class="keyword">break</span>;
  246. <span class="keyword">case</span> <span class="string">"update"</span>:
  247. resp = store.update(model);
  248. <span class="keyword">break</span>;
  249. <span class="keyword">case</span> <span class="string">"delete"</span>:
  250. resp = store.destroy(model);
  251. <span class="keyword">break</span>;
  252. }
  253. } <span class="keyword">catch</span>(error) {
  254. <span class="keyword">if</span> (error.code === DOMException.QUOTA_EXCEEDED_ERR &amp;&amp; window.localStorage.length === <span class="number">0</span>)
  255. errorMessage = <span class="string">"Private browsing is unsupported"</span>;
  256. <span class="keyword">else</span>
  257. errorMessage = error.message;
  258. }
  259. <span class="keyword">if</span> (resp) {
  260. model.trigger(<span class="string">"sync"</span>, model, resp, options);
  261. <span class="keyword">if</span> (options &amp;&amp; options.success)
  262. options.success(resp);
  263. <span class="keyword">if</span> (syncDfd)
  264. syncDfd.resolve(resp);
  265. } <span class="keyword">else</span> {
  266. errorMessage = errorMessage ? errorMessage
  267. : <span class="string">"Record Not Found"</span>;
  268. <span class="keyword">if</span> (options &amp;&amp; options.error)
  269. options.error(errorMessage);
  270. <span class="keyword">if</span> (syncDfd)
  271. syncDfd.reject(errorMessage);
  272. }</pre></div></div>
  273. </li>
  274. <li id="section-16">
  275. <div class="annotation">
  276. <div class="pilwrap ">
  277. <a class="pilcrow" href="#section-16">&#182;</a>
  278. </div>
  279. <p>add compatibility with $.ajax
  280. always execute callback for success and error</p>
  281. </div>
  282. <div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (options &amp;&amp; options.complete) options.complete(resp);
  283. <span class="keyword">return</span> syncDfd &amp;&amp; syncDfd.promise();
  284. };
  285. Backbone.ajaxSync = Backbone.sync;
  286. Backbone.getSyncMethod = <span class="keyword">function</span>(model) {
  287. <span class="keyword">if</span>(model.localStorage || (model.collection &amp;&amp; model.collection.localStorage)) {
  288. <span class="keyword">return</span> Backbone.localSync;
  289. }
  290. <span class="keyword">return</span> Backbone.ajaxSync;
  291. };</pre></div></div>
  292. </li>
  293. <li id="section-17">
  294. <div class="annotation">
  295. <div class="pilwrap ">
  296. <a class="pilcrow" href="#section-17">&#182;</a>
  297. </div>
  298. <p>Override &#39;Backbone.sync&#39; to default to localSync,
  299. the original &#39;Backbone.sync&#39; is still available in &#39;Backbone.ajaxSync&#39;</p>
  300. </div>
  301. <div class="content"><div class='highlight'><pre>Backbone.sync = <span class="keyword">function</span>(method, model, options) {
  302. <span class="keyword">return</span> Backbone.getSyncMethod(model).apply(<span class="keyword">this</span>, [method, model, options]);
  303. };
  304. <span class="keyword">return</span> Backbone.LocalStorage;
  305. }));</pre></div></div>
  306. </li>
  307. </ul>
  308. </div>
  309. </body>
  310. </html>