From 73d743a1c30c1b133306c81911876ce740aab08b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Wed, 15 May 2019 17:30:01 +0200 Subject: [PATCH] [FIX] observer: newly observed object/arrays have higher rev Some people apparently believe that the framework should magically solves all problems from the programmers, shielding him from thinking. It is not possible, and maybe a bad idea, because it will only delay the inevitable... If one does weird stuff without knowing what is going on, someone will get hurt. However, in this specific case, something can be done. closes #104 --- src/observer.ts | 8 +++++--- tests/observer.test.ts | 10 ++++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/observer.ts b/src/observer.ts index a2e2b69f..f39c865e 100644 --- a/src/observer.ts +++ b/src/observer.ts @@ -39,6 +39,7 @@ for (let method of methodsToPatch) { if (!this.__observer__.allowMutations) { throw new Error(`Array cannot be changed here")`); } + this.__observer__.rev++; this.__observer__.notifyChange(); this.__owl__.rev++; let parent = this; @@ -74,7 +75,6 @@ export class Observer { notifyCB() {} notifyChange() { - this.rev++; this.dirty = true; Promise.resolve().then(() => { if (this.dirty) { @@ -105,6 +105,7 @@ export class Observer { } set(target: any, key: number | string, value: any) { + this.rev++; this._addProp(target, key, value); target.__owl__.rev++; this.notifyChange(); @@ -112,7 +113,7 @@ export class Observer { _observeObj(obj: T, parent?: any) { const keys = Object.keys(obj); - obj.__owl__ = { rev: 1, deepRev: 1, parent }; + obj.__owl__ = { rev: this.rev, deepRev: this.rev, parent }; Object.defineProperty(obj, "__owl__", { enumerable: false }); for (let key of keys) { this._addProp(obj, key, obj[key]); @@ -120,7 +121,7 @@ export class Observer { } _observeArr(arr: Array, parent?: any) { - (arr).__owl__ = { rev: 1, deepRev: 1, parent }; + (arr).__owl__ = { rev: this.rev, deepRev: this.rev, parent }; Object.defineProperty(arr, "__owl__", { enumerable: false }); (arr).__proto__ = Object.create(ModifiedArrayProto); (arr).__proto__.__observer__ = this; @@ -142,6 +143,7 @@ export class Observer { }, set(newVal) { if (newVal !== value) { + self.rev++; if (!self.allowMutations) { throw new Error( `Observed state cannot be changed here! (key: "${key}", val: "${newVal}")` diff --git a/tests/observer.test.ts b/tests/observer.test.ts index 9b58f397..e165ae41 100644 --- a/tests/observer.test.ts +++ b/tests/observer.test.ts @@ -126,12 +126,12 @@ describe("observer", () => { arr.push({ kriek: 5 }); expect(observer.rev).toBe(2); expect(arr.__owl__.rev).toBe(2); - expect(arr[0].__owl__.rev).toBe(1); + expect(arr[0].__owl__.rev).toBe(2); arr[0].kriek = 6; expect(observer.rev).toBe(3); expect(arr.__owl__.rev).toBe(2); - expect(arr[0].__owl__.rev).toBe(2); + expect(arr[0].__owl__.rev).toBe(3); }); test("properly observe arrays in object", () => { @@ -180,12 +180,14 @@ describe("observer", () => { obj.a = { b: 2 }; expect(observer.rev).toBe(2); expect(obj.__owl__.rev).toBe(2); - expect(obj.a.__owl__.rev).toBe(1); + + // we start at 2 because it is the new observer rev number + expect(obj.a.__owl__.rev).toBe(2); obj.a.b = 3; expect(observer.rev).toBe(3); expect(obj.__owl__.rev).toBe(2); - expect(obj.a.__owl__.rev).toBe(2); + expect(obj.a.__owl__.rev).toBe(3); }); test("deep observe misc changes", () => {