-
Notifications
You must be signed in to change notification settings - Fork 72
/
firebase-document.html
153 lines (114 loc) · 3.68 KB
/
firebase-document.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<link rel="import" href="../polymer/polymer.html">
<link rel="import" href="firebase.html">
<link rel="import" href="firebase-query-behavior.html">
<!--
**Note: This element is for the older Firebase 2 API**
For the latest official Firebase 3.0-compatible component from the Firebase team,
see the [polymerfire](https://github.com/firebase/polymerfire) component.
An element wrapper for the Firebase API.
A `<firebase-document>` is a reference to a remote document somewhere on
Firebase. The element fetchs a document at a provided `location`, and exposes
it as an Object that is suitable for deep two-way databinding.
Example:
<firebase-document
location="https://dinosaur-facts.firebaseio.com/dinosaurs"
data="{{dinosaurs}}"></firebase-document>
In the above example, if the `dinosaurs` object is data-bound elsewhere via
Polymer's data-binding system, changes to the document will be automatically
reflected in the remote document and any other clients referencing that
document.
@demo demo/index.html
-->
<script>
Polymer({
is: 'firebase-document',
behaviors: [
Polymer.FirebaseQueryBehavior
],
properties: {
/**
* Firebase Query object corresponding to `location`.
*/
query: {
type: Object,
notify: true,
computed: '_computeQuery(location)',
observer: '_queryChanged'
},
/**
* The `data` object mapped to `location`.
*/
data: {
type: Object,
notify: true
}
},
listeners: {
'firebase-value': '_onFirebaseValue'
},
_localDataChanged: function(change) {
var pathFragments = change.path.split('.');
if (pathFragments.length === 1) {
this._updateRemoteDocument();
return;
}
this._setRemoteDocumentChild(
pathFragments[1],
change.base[pathFragments[1]]
);
},
_onFirebaseValue: function(event) {
this._applyRemoteDataChange(function() {
this.set('data', event.detail.val());
});
},
_computeQuery: function(location) {
if (!location) {
return;
}
var query;
try {
query = new Firebase(location);
} catch(e) {
this._fireQueryError('Query cannot be instantiated with location ' + location + ' (' + e.toString() + ')');
} finally {
return query;
}
},
_updateRemoteDocument: function() {
this._log('Updating remote document');
if (!this.query) {
this._fireQueryError('Query does not exist');
return;
}
this.query.update(this.dataAsObject);
},
_setRemoteDocumentChild: function(key, value) {
if (!this.query) {
this._fireQueryError('Query does not exist');
return;
}
this.debounce('set-' + key, function() {
this._log('Setting child "' + key + '" to', value);
this.query.child(key).set(value);
});
},
_removeRemoteDocumentChild: function(key) {
this._log('Removing child "' + key + '"');
if (!this.query) {
this._fireQueryError('Query does not exist');
return;
}
this.query.child(key).remove();
}
});
</script>