From a897fd4f875764a542843c5cccea58d991e7e6a0 Mon Sep 17 00:00:00 2001 From: christophe-g Date: Wed, 21 Dec 2016 14:48:11 +0100 Subject: [PATCH 1/5] loop over data property to update only necessary persistedData keys --- app-indexeddb-mirror/app-indexeddb-mirror.html | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/app-indexeddb-mirror/app-indexeddb-mirror.html b/app-indexeddb-mirror/app-indexeddb-mirror.html index 407ab69..1d8eca3 100644 --- a/app-indexeddb-mirror/app-indexeddb-mirror.html +++ b/app-indexeddb-mirror/app-indexeddb-mirror.html @@ -250,7 +250,19 @@ }); if (this.online) { - this.persistedData = this.data; + + // set the value if persisteddoes not exist or data is primitive or if firebase data obj contain less keys than persisted (https://github.com/Polymer/polymer/issues/2565) + if (!this.persistedData || typeof this.data !== 'object' || ( Object.keys(this.data).length < Object.keys(this.persistedData).length)) { + this.persistedData = this.data; + } else { + + // now, we loop over keys + for (var prop in this.data) { + if(this.persistedData[prop] !== this.data[prop]) { + this.set(['persisedData', prop], this.data[prop]); + } + } + } this.linkPaths('data', 'persistedData'); } else { this.unlinkPaths('data', 'persistedData'); From 50845e97198f73f8b2de7a8b229a6eef0152046e Mon Sep 17 00:00:00 2001 From: christophe-g Date: Wed, 21 Dec 2016 15:54:16 +0100 Subject: [PATCH 2/5] modified check for first sync --- app-indexeddb-mirror/app-indexeddb-mirror.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app-indexeddb-mirror/app-indexeddb-mirror.html b/app-indexeddb-mirror/app-indexeddb-mirror.html index 1d8eca3..94d0f4f 100644 --- a/app-indexeddb-mirror/app-indexeddb-mirror.html +++ b/app-indexeddb-mirror/app-indexeddb-mirror.html @@ -251,8 +251,8 @@ if (this.online) { - // set the value if persisteddoes not exist or data is primitive or if firebase data obj contain less keys than persisted (https://github.com/Polymer/polymer/issues/2565) - if (!this.persistedData || typeof this.data !== 'object' || ( Object.keys(this.data).length < Object.keys(this.persistedData).length)) { + // set the value if persisted does not exist or data is primitive or if firebase data obj contain less keys than persisted (https://github.com/Polymer/polymer/issues/2565) + if (typeof this.data !== 'object' || Object.keys(this.persistedData).length === 0 || ( Object.keys(this.data).length < Object.keys(this.persistedData).length)) { this.persistedData = this.data; } else { From 370544b6162bbd1ec8d2f0bf3bcd4136f29fd966 Mon Sep 17 00:00:00 2001 From: christophe-g Date: Wed, 21 Dec 2016 16:40:26 +0100 Subject: [PATCH 3/5] revise conditions for setting persisted data --- .../app-indexeddb-mirror.html | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/app-indexeddb-mirror/app-indexeddb-mirror.html b/app-indexeddb-mirror/app-indexeddb-mirror.html index 94d0f4f..1b6dcad 100644 --- a/app-indexeddb-mirror/app-indexeddb-mirror.html +++ b/app-indexeddb-mirror/app-indexeddb-mirror.html @@ -251,15 +251,17 @@ if (this.online) { - // set the value if persisted does not exist or data is primitive or if firebase data obj contain less keys than persisted (https://github.com/Polymer/polymer/issues/2565) - if (typeof this.data !== 'object' || Object.keys(this.persistedData).length === 0 || ( Object.keys(this.data).length < Object.keys(this.persistedData).length)) { - this.persistedData = this.data; - } else { - - // now, we loop over keys - for (var prop in this.data) { - if(this.persistedData[prop] !== this.data[prop]) { - this.set(['persisedData', prop], this.data[prop]); + if(this.persistedData !== this.data) { + // set the value if persistedData does not exist or if data is primitive or if persistedData is empty or if firebase data obj contain less keys than persisted (https://github.com/Polymer/polymer/issues/2565) + if (!this.persistedData || typeof this.data !== 'object' || Object.keys(this.persistedData).length === 0 || ( Object.keys(this.data).length < Object.keys(this.persistedData).length)) { + this.persistedData = this.data; + } else { + + // now, we loop over keys + for (var prop in this.data) { + if(this.persistedData[prop] !== this.data[prop]) { + this.set(['persisedData', prop], this.data[prop]); + } } } } From e19ee30c5d04f93d996f8ac3047bc9f31f421fae Mon Sep 17 00:00:00 2001 From: christophe-g Date: Tue, 3 Jan 2017 16:45:51 +0100 Subject: [PATCH 4/5] better without typo --- app-indexeddb-mirror/app-indexeddb-mirror.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app-indexeddb-mirror/app-indexeddb-mirror.html b/app-indexeddb-mirror/app-indexeddb-mirror.html index 1b6dcad..dea8bde 100644 --- a/app-indexeddb-mirror/app-indexeddb-mirror.html +++ b/app-indexeddb-mirror/app-indexeddb-mirror.html @@ -260,7 +260,7 @@ // now, we loop over keys for (var prop in this.data) { if(this.persistedData[prop] !== this.data[prop]) { - this.set(['persisedData', prop], this.data[prop]); + this.set(['persistedData', prop], this.data[prop]); } } } From afc947af2798f0ddd6b2355e8cda8aa972b5a540 Mon Sep 17 00:00:00 2001 From: christophe-g Date: Fri, 6 Jan 2017 11:48:18 +0100 Subject: [PATCH 5/5] added disconnected behavior to handle case where data and persisted data shod not be linked even when we are online. Debouncing __updatePersistedData --- .../app-indexeddb-mirror.html | 63 +++++++++++-------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/app-indexeddb-mirror/app-indexeddb-mirror.html b/app-indexeddb-mirror/app-indexeddb-mirror.html index dea8bde..3397397 100644 --- a/app-indexeddb-mirror/app-indexeddb-mirror.html +++ b/app-indexeddb-mirror/app-indexeddb-mirror.html @@ -186,6 +186,16 @@ observer: '__clientChanged' }, + /** + * `disconnected` treat this element as if it is offline. + * This is useful when data is linked to a remote resource + * that not accessible (e.g resource only accessible when a user in logged-in) + */ + disconnected: { + type: Boolean, + value: false + }, + /** * When online, this property is a pass-through value mapped directly * to the `data` property of this element. @@ -200,7 +210,7 @@ }, observers: [ - '__updatePersistedData(client, key, session, online)', + '__updatePersistedData(client, key, session, online, disconnected)', '__updatePersistedData(data.*)', ], @@ -249,35 +259,38 @@ return this.client.validateSession(this.session); }); - if (this.online) { + this.debounce('app-indexddb-mirror-update', function() { - if(this.persistedData !== this.data) { - // set the value if persistedData does not exist or if data is primitive or if persistedData is empty or if firebase data obj contain less keys than persisted (https://github.com/Polymer/polymer/issues/2565) - if (!this.persistedData || typeof this.data !== 'object' || Object.keys(this.persistedData).length === 0 || ( Object.keys(this.data).length < Object.keys(this.persistedData).length)) { - this.persistedData = this.data; - } else { - - // now, we loop over keys - for (var prop in this.data) { - if(this.persistedData[prop] !== this.data[prop]) { - this.set(['persistedData', prop], this.data[prop]); + if (this.online && !this.disconnected) { + + if(this.persistedData !== this.data) { + // set the value if persistedData does not exist or if data is primitive or if persistedData is empty or if firebase data obj contain less keys than persisted (https://github.com/Polymer/polymer/issues/2565) + if (!this.persistedData || typeof this.data !== 'object' || Object.keys(this.persistedData).length === 0 || ( Object.keys(this.data).length < Object.keys(this.persistedData).length)) { + this.persistedData = this.data; + } else { + + // now, we loop over keys + for (var prop in this.data) { + if(this.persistedData[prop] !== this.data[prop]) { + this.set(['persistedData', prop], this.data[prop]); + } } } } + this.linkPaths('data', 'persistedData'); + } else { + this.unlinkPaths('data', 'persistedData'); + this._enqueueTransaction(function() { + return this.getStoredValue().then(function(value) { + // We may have gone online since retrieving the persisted value.. + if (this.online || !this.client.supportsMirroring) { + return; + } + this.persistedData = value; + }.bind(this)); + }); } - this.linkPaths('data', 'persistedData'); - } else { - this.unlinkPaths('data', 'persistedData'); - this._enqueueTransaction(function() { - return this.getStoredValue().then(function(value) { - // We may have gone online since retrieving the persisted value.. - if (this.online || !this.client.supportsMirroring) { - return; - } - this.persistedData = value; - }.bind(this)); - }); - } + }); } }); })();