From f403f901881dbe0742d00c826e4d21ef10f084b3 Mon Sep 17 00:00:00 2001 From: jwngr Date: Wed, 8 Jul 2015 17:09:15 -0700 Subject: [PATCH 1/2] Added $key to bound objects --- src/reactfire.js | 46 +++++++++++++++++++++++------------------ tests/reactfire.spec.js | 35 +++++++++++++++++++++---------- 2 files changed, 50 insertions(+), 31 deletions(-) diff --git a/src/reactfire.js b/src/reactfire.js index 84f8a00..c2b32e9 100644 --- a/src/reactfire.js +++ b/src/reactfire.js @@ -84,6 +84,25 @@ } } + /** + * Creates a new array record record given a key-value pair. + * + * @param {string} key The new record's key. + * @param {any} value The new record's value. + * @return {Object} The new record. + */ + function _createRecord(key, value) { + var record = {}; + if (typeof value === 'object' && value !== null) { + record = value; + } else { + record.$value = value; + } + record.$key = key; + + return record; + } + /******************************/ /* BIND AS OBJECT LISTENERS */ @@ -95,7 +114,11 @@ * @param {Firebase.DataSnapshot} snapshot A snapshot of the data being bound. */ function _objectValue(bindVar, snapshot) { - this.data[bindVar] = snapshot.val(); + var key = snapshot.key(); + var value = snapshot.val(); + + this.data[bindVar] = _createRecord(key, value); + this.setState(this.data); } @@ -103,25 +126,6 @@ /*****************************/ /* BIND AS ARRAY LISTENERS */ /*****************************/ - /** - * Creates a new array record record given a key-value pair. - * - * @param {string} key The new record's key. - * @param {any} value The new record's value. - * @return {Object} The new record. - */ - function _createRecord(key, value) { - var record = {}; - if (typeof value === 'object') { - record = value; - } else { - record.$value = value; - } - record.$key = key; - - return record; - } - /** * 'child_added' listener which adds a new record to the bound array. * @@ -291,6 +295,7 @@ */ componentWillUnmount: function() { for (var bindVar in this.firebaseRefs) { + /* istanbul ignore else */ if (this.firebaseRefs.hasOwnProperty(bindVar)) { this.unbind(bindVar); } @@ -340,6 +345,7 @@ // Turn off all Firebase listeners for (var event in this.firebaseListeners[bindVar]) { + /* istanbul ignore else */ if (this.firebaseListeners[bindVar].hasOwnProperty(event)) { var offListener = this.firebaseListeners[bindVar][event]; this.firebaseRefs[bindVar].off(event, offListener); diff --git a/tests/reactfire.spec.js b/tests/reactfire.spec.js index c6bbc95..3d21012 100644 --- a/tests/reactfire.spec.js +++ b/tests/reactfire.spec.js @@ -607,7 +607,7 @@ describe('ReactFire', function() { mixins: [ReactFireMixin], componentWillMount: function() { - this.bindAsObject(firebaseRef, 'items'); + this.bindAsObject(firebaseRef.child('items'), 'items'); var obj = { first: { index: 0 }, @@ -615,7 +615,8 @@ describe('ReactFire', function() { third: { index: 2 } }; - firebaseRef.set(obj, function() { + firebaseRef.child('items').set(obj, function() { + obj.$key = 'items'; expect(this.state.items).to.deep.equal(obj); done(); @@ -635,10 +636,13 @@ describe('ReactFire', function() { mixins: [ReactFireMixin], componentWillMount: function() { - this.bindAsObject(firebaseRef, 'items'); + this.bindAsObject(firebaseRef.child('items'), 'items'); - firebaseRef.set('foo', function() { - expect(this.state.items).to.deep.equal('foo'); + firebaseRef.child('items').set('foo', function() { + expect(this.state.items).to.deep.equal({ + $key: 'items', + $value: 'foo' + }); done(); }.bind(this)); @@ -652,15 +656,18 @@ describe('ReactFire', function() { shallowRenderer.render(React.createElement(TestComponent)); }); - it('binds as null for Firebase references with no data', function(done) { + it('binds to Firebase references with no data', function(done) { var TestComponent = React.createClass({ mixins: [ReactFireMixin], componentWillMount: function() { - this.bindAsObject(firebaseRef, 'items'); + this.bindAsObject(firebaseRef.child('items'), 'items'); - firebaseRef.set(null, function() { - expect(this.state.items).to.be.null; + firebaseRef.child('items').set(null, function() { + expect(this.state.items).to.deep.equal({ + $key: 'items', + $value: null + }); done(); }.bind(this)); @@ -679,14 +686,15 @@ describe('ReactFire', function() { mixins: [ReactFireMixin], componentWillMount: function() { - this.bindAsObject(firebaseRef.limitToLast(2), 'items'); + this.bindAsObject(firebaseRef.child('items').limitToLast(2), 'items'); - firebaseRef.set({ + firebaseRef.child('items').set({ first: { index: 0 }, second: { index: 1 }, third: { index: 2 } }, function() { expect(this.state.items).to.deep.equal({ + $key: 'items', second: { index: 1 }, third: { index: 2 } }); @@ -729,7 +737,10 @@ describe('ReactFire', function() { items0: items0, items1: items1 }, function() { + items0.$key = 'items0'; expect(this.state.bindVar0).to.deep.equal(items0); + + items1.$key = 'items1'; expect(this.state.bindVar1).to.deep.equal(items1); done(); @@ -770,7 +781,9 @@ describe('ReactFire', function() { items0: items0, items1: items1 }, function() { + items0.$key = 'items0'; expect(this.state.bindVar0).to.deep.equal(items0); + expect(this.state.bindVar1).to.deep.equal([ { $key: 'bar', foo: 'baz' }, { $key: 'baz', $value: true }, From d6d4a0d3a083b4cef88c9c881bfafced19b9470c Mon Sep 17 00:00:00 2001 From: jwngr Date: Wed, 8 Jul 2015 17:10:22 -0700 Subject: [PATCH 2/2] Fixed comment for _createRecord() --- src/reactfire.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reactfire.js b/src/reactfire.js index c2b32e9..a544ccc 100644 --- a/src/reactfire.js +++ b/src/reactfire.js @@ -85,7 +85,7 @@ } /** - * Creates a new array record record given a key-value pair. + * Creates a new record given a key-value pair. * * @param {string} key The new record's key. * @param {any} value The new record's value.