OLD | NEW |
| (Empty) |
1 <!-- | |
2 Copyright (c) 2014 The Polymer Project Authors. All rights reserved. | |
3 This code may only be used under the BSD style license found at http://polymer.g
ithub.io/LICENSE.txt | |
4 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt | |
5 The complete set of contributors may be found at http://polymer.github.io/CONTRI
BUTORS.txt | |
6 Code distributed by Google as part of the polymer project is also | |
7 subject to an additional IP rights grant found at http://polymer.github.io/PATEN
TS.txt | |
8 --> | |
9 | |
10 <!-- | |
11 Element access to localStorage. The "name" property | |
12 is the key to the data ("value" property) stored in localStorage. | |
13 | |
14 `core-localstorage` automatically saves the value to localStorage when | |
15 value is changed. Note that if value is an object auto-save will be | |
16 triggered only when value is a different instance. | |
17 | |
18 <core-localstorage name="my-app-storage" value="{{value}}"></core-localstora
ge> | |
19 | |
20 @group Polymer Core Elements | |
21 @element core-localstorage | |
22 @blurb Element access to localStorage. | |
23 @url github.io | |
24 @categories Data | |
25 --> | |
26 | |
27 <link rel="import" href="../polymer/polymer.html"> | |
28 | |
29 <polymer-element name="core-localstorage" attributes="name value useRaw autoSave
Disabled" hidden> | |
30 <script> | |
31 | |
32 Polymer('core-localstorage', { | |
33 | |
34 /** | |
35 * Fired when a value is loaded from localStorage. | |
36 * @event core-localstorage-load | |
37 */ | |
38 | |
39 /** | |
40 * The key to the data stored in localStorage. | |
41 * | |
42 * @attribute name | |
43 * @type string | |
44 * @default null | |
45 */ | |
46 name: '', | |
47 | |
48 /** | |
49 * The data associated with the specified name. | |
50 * | |
51 * @attribute value | |
52 * @type object | |
53 * @default null | |
54 */ | |
55 value: null, | |
56 | |
57 /** | |
58 * If true, the value is stored and retrieved without JSON processing. | |
59 * | |
60 * @attribute useRaw | |
61 * @type boolean | |
62 * @default false | |
63 */ | |
64 useRaw: false, | |
65 | |
66 /** | |
67 * If true, auto save is disabled. | |
68 * | |
69 * @attribute autoSaveDisabled | |
70 * @type boolean | |
71 * @default false | |
72 */ | |
73 autoSaveDisabled: false, | |
74 | |
75 attached: function() { | |
76 // wait for bindings are all setup | |
77 this.async('load'); | |
78 }, | |
79 | |
80 valueChanged: function() { | |
81 if (this.loaded && !this.autoSaveDisabled) { | |
82 this.save(); | |
83 } | |
84 }, | |
85 | |
86 load: function() { | |
87 var v = localStorage.getItem(this.name); | |
88 if (this.useRaw) { | |
89 this.value = v; | |
90 } else { | |
91 // localStorage has a flaw that makes it difficult to determine | |
92 // if a key actually exists or not (getItem returns null if the | |
93 // key doesn't exist, which is not distinguishable from a stored | |
94 // null value) | |
95 // however, if not `useRaw`, an (unparsed) null value unambiguously | |
96 // signals that there is no value in storage (a stored null value would | |
97 // be escaped, i.e. "null") | |
98 // in this case we save any non-null current (default) value | |
99 if (v === null) { | |
100 if (this.value != null) { | |
101 this.save(); | |
102 } | |
103 } else { | |
104 try { | |
105 v = JSON.parse(v); | |
106 } catch(x) { | |
107 } | |
108 this.value = v; | |
109 } | |
110 } | |
111 this.loaded = true; | |
112 this.asyncFire('core-localstorage-load'); | |
113 }, | |
114 | |
115 /** | |
116 * Saves the value to localStorage. | |
117 * | |
118 * @method save | |
119 */ | |
120 save: function() { | |
121 var v = this.useRaw ? this.value : JSON.stringify(this.value); | |
122 localStorage.setItem(this.name, v); | |
123 } | |
124 | |
125 }); | |
126 | |
127 </script> | |
128 </polymer-element> | |
OLD | NEW |