1
+ let Vue // late binding
2
+
1
3
/**
2
4
* Check if a value is an object.
3
5
*
@@ -43,13 +45,12 @@ function indexForKey (array, key) {
43
45
* Bind a firebase data source to a key on a vm.
44
46
*
45
47
* @param {Vue } vm
46
- * @param {object } data
47
48
* @param {string } key
48
49
* @param {object } source
49
50
*/
50
- function bind ( vm , data , key , source ) {
51
+ function bind ( vm , key , source ) {
51
52
if ( ! isObject ( source ) ) {
52
- throw new Error ( 'Invalid Firebase binding source' )
53
+ throw new Error ( 'VueFire: invalid Firebase binding source. ' )
53
54
}
54
55
var asArray = false
55
56
var cancelCallback = null
@@ -68,23 +69,23 @@ function bind (vm, data, key, source) {
68
69
vm . _firebaseSources [ key ] = source
69
70
// bind based on initial value type
70
71
if ( asArray ) {
71
- bindAsArray ( vm , data , key , source , cancelCallback )
72
+ bindAsArray ( vm , key , source , cancelCallback )
72
73
} else {
73
- bindAsObject ( vm , data , key , source , cancelCallback )
74
+ bindAsObject ( vm , key , source , cancelCallback )
74
75
}
75
76
}
76
77
77
78
/**
78
79
* Bind a firebase data source to a key on a vm as an Array.
79
80
*
80
81
* @param {Vue } vm
81
- * @param {object } data
82
82
* @param {string } key
83
83
* @param {object } source
84
84
* @param {function|null } cancelCallback
85
85
*/
86
- function bindAsArray ( vm , data , key , source , cancelCallback ) {
87
- var array = data [ key ] = [ ]
86
+ function bindAsArray ( vm , key , source , cancelCallback ) {
87
+ var array = [ ]
88
+ Vue . util . defineReactive ( vm , key , array )
88
89
89
90
var onAdd = source . on ( 'child_added' , function ( snapshot , prevKey ) {
90
91
var index = prevKey ? indexForKey ( array , prevKey ) + 1 : 0
@@ -120,13 +121,12 @@ function bindAsArray (vm, data, key, source, cancelCallback) {
120
121
* Bind a firebase data source to a key on a vm as an Object.
121
122
*
122
123
* @param {Vue } vm
123
- * @param {object } data
124
124
* @param {string } key
125
125
* @param {Object } source
126
126
* @param {function|null } cancelCallback
127
127
*/
128
- function bindAsObject ( vm , data , key , source , cancelCallback ) {
129
- data [ key ] = { }
128
+ function bindAsObject ( vm , key , source , cancelCallback ) {
129
+ Vue . util . defineReactive ( vm , key , { } )
130
130
var cb = source . on ( 'value' , function ( snapshot ) {
131
131
vm [ key ] = snapshot . val ( )
132
132
} , cancelCallback )
@@ -154,15 +154,8 @@ var VueFireMixin = {
154
154
this . $firebaseRefs = Object . create ( null )
155
155
this . _firebaseSources = Object . create ( null )
156
156
this . _firebaseListeners = Object . create ( null )
157
- // wrap data fn
158
- var vm = this
159
- var getData = this . $options . data
160
- this . $options . data = function ( ) {
161
- var data = getData ( )
162
- for ( var key in bindings ) {
163
- bind ( vm , data , key , bindings [ key ] )
164
- }
165
- return data
157
+ for ( var key in bindings ) {
158
+ bind ( this , key , bindings [ key ] )
166
159
}
167
160
} ,
168
161
beforeDestroy : function ( ) {
@@ -178,13 +171,21 @@ var VueFireMixin = {
178
171
/**
179
172
* Install function passed to Vue.use() in manual installation.
180
173
*
181
- * @param {function } Vue
174
+ * @param {function } _Vue
182
175
*/
183
- function install ( Vue ) {
176
+ function install ( _Vue ) {
177
+ Vue = _Vue
184
178
Vue . mixin ( VueFireMixin )
185
179
// use object-based merge strategy
186
180
var mergeStrats = Vue . config . optionMergeStrategies
187
181
mergeStrats . firebase = mergeStrats . methods
182
+ // extend instance methods
183
+ Vue . prototype . $bind = function ( key , source ) {
184
+ bind ( this , key , source )
185
+ }
186
+ Vue . prototype . $unbind = function ( key ) {
187
+ unbind ( this , key )
188
+ }
188
189
}
189
190
190
191
// auto install
0 commit comments