diff --git a/src/store.ts b/src/store.ts index 4bcb6545..e95b0222 100644 --- a/src/store.ts +++ b/src/store.ts @@ -137,6 +137,7 @@ export function makeObserver(): Observer { ); } if (newVal !== value) { + unobserve(value); value = newVal; observe(newVal, obj); obj.__owl__.rev!++; @@ -229,6 +230,12 @@ export function makeObserver(): Observer { } } + function unobserve(target: any) { + if (target !== null && typeof target === "object") { + delete target.__owl__; + } + } + return observer; } diff --git a/tests/store.test.ts b/tests/store.test.ts index 01c618d8..3c9929c3 100644 --- a/tests/store.test.ts +++ b/tests/store.test.ts @@ -308,6 +308,18 @@ describe("observer", () => { expect(state.a.__owl__.rev).toBe(2); }); + test("properly unobserve objects in object", () => { + const observer = makeObserver(); + const state: any = { a: { b: 1 } }; + observer.observe(state); + expect(state.__owl__.rev).toBe(1); + const initialA = state.a; + expect(initialA.__owl__.rev).toBe(1); + + state.a = "Karlsquell"; + expect(initialA.__owl__).not.toBeDefined(); + }); + test("reobserve new object values", () => { const observer = makeObserver(); const obj: any = { a: 1 };