From 9ee85e220b47faca643d33e67208a864964c4ad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Mon, 15 Apr 2019 10:43:50 +0200 Subject: [PATCH] [FIX] store: unobserve detached objects closes #27 --- src/store.ts | 7 +++++++ tests/store.test.ts | 12 ++++++++++++ 2 files changed, 19 insertions(+) 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 };