Skip to content

Commit 102e0b1

Browse files
committed
Add readyCallback
Closes #69 Allows to pass a callback that is called once the data has been retrieved. This callback is only called once.
1 parent 23c8edf commit 102e0b1

File tree

2 files changed

+96
-4
lines changed

2 files changed

+96
-4
lines changed

src/vuefire.js

+11-4
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,12 @@ function indexForKey (array, key) {
8080
function bind (vm, key, source) {
8181
var asObject = false
8282
var cancelCallback = null
83+
var readyCallback = null
8384
// check { source, asArray, cancelCallback } syntax
8485
if (isObject(source) && source.hasOwnProperty('source')) {
8586
asObject = source.asObject
8687
cancelCallback = source.cancelCallback
88+
readyCallback = source.readyCallback
8789
source = source.source
8890
}
8991
if (!isObject(source)) {
@@ -98,6 +100,9 @@ function bind (vm, key, source) {
98100
} else {
99101
bindAsArray(vm, key, source, cancelCallback)
100102
}
103+
if (readyCallback) {
104+
source.once('value', readyCallback.bind(vm))
105+
}
101106
}
102107

103108
/**
@@ -250,20 +255,22 @@ function install (_Vue) {
250255
mergeStrats.firebase = mergeStrats.methods
251256

252257
// extend instance methods
253-
Vue.prototype.$bindAsObject = function (key, source, cancelCallback) {
258+
Vue.prototype.$bindAsObject = function (key, source, cancelCallback, readyCallback) {
254259
ensureRefs(this)
255260
bind(this, key, {
256261
source: source,
257262
asObject: true,
258-
cancelCallback: cancelCallback
263+
cancelCallback: cancelCallback,
264+
readyCallback: readyCallback
259265
})
260266
}
261267

262-
Vue.prototype.$bindAsArray = function (key, source, cancelCallback) {
268+
Vue.prototype.$bindAsArray = function (key, source, cancelCallback, readyCallback) {
263269
ensureRefs(this)
264270
bind(this, key, {
265271
source: source,
266-
cancelCallback: cancelCallback
272+
cancelCallback: cancelCallback,
273+
readyCallback: readyCallback
267274
})
268275
}
269276

tests/vuefire.spec.js

+85
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,91 @@ describe('VueFire', function () {
3939
})
4040
})
4141

42+
describe('on ready callback', function () {
43+
it('arrays', function (done) {
44+
firebaseRef.set({
45+
first: { index: 0 },
46+
second: { index: 1 },
47+
third: { index: 2 }
48+
}, function () {
49+
new Vue({
50+
firebase: {
51+
items: {
52+
source: firebaseRef,
53+
readyCallback: function () {
54+
expect(this.items).to.deep.equal([
55+
{ '.key': 'first', index: 0 },
56+
{ '.key': 'second', index: 1 },
57+
{ '.key': 'third', index: 2 }
58+
])
59+
done()
60+
}
61+
}
62+
}
63+
}).$mount()
64+
})
65+
})
66+
67+
it('objects', function (done) {
68+
firebaseRef.child('first').set({
69+
index: 0
70+
}, function () {
71+
new Vue({
72+
firebase: {
73+
item: {
74+
source: firebaseRef.child('first'),
75+
asObject: true,
76+
readyCallback: function () {
77+
expect(this.item).to.deep.equal(
78+
{ '.key': 'first', index: 0 }
79+
)
80+
done()
81+
}
82+
}
83+
}
84+
}).$mount()
85+
})
86+
})
87+
88+
it('$bindAsArray', function (done) {
89+
firebaseRef.set({
90+
first: { index: 0 },
91+
second: { index: 1 },
92+
third: { index: 2 }
93+
}, function () {
94+
new Vue({
95+
created: function () {
96+
this.$bindAsArray('items', firebaseRef, null, function () {
97+
expect(this.items).to.deep.equal([
98+
{ '.key': 'first', index: 0 },
99+
{ '.key': 'second', index: 1 },
100+
{ '.key': 'third', index: 2 }
101+
])
102+
done()
103+
})
104+
}
105+
}).$mount()
106+
})
107+
})
108+
109+
it('$bindAsObject', function (done) {
110+
firebaseRef.child('first').set({
111+
index: 0
112+
}, function () {
113+
new Vue({
114+
created: function () {
115+
this.$bindAsObject('item', firebaseRef.child('first'), null, function () {
116+
expect(this.item).to.deep.equal(
117+
{ '.key': 'first', index: 0 }
118+
)
119+
done()
120+
})
121+
}
122+
}).$mount()
123+
})
124+
})
125+
})
126+
42127
describe('bind as Array', function () {
43128
it('throws error for invalid firebase ref', function () {
44129
helpers.invalidFirebaseRefs.forEach(function (ref) {

0 commit comments

Comments
 (0)