From eaf912bed733f2588a03375d6e7cba7104defd83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Thu, 22 Aug 2019 13:49:41 +0200 Subject: [PATCH] [FIX] observer: properly handle dates --- doc/component.md | 3 ++- src/core/observer.ts | 2 +- tests/core/observer.test.ts | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/doc/component.md b/doc/component.md index a12cf4de..151e38c8 100644 --- a/doc/component.md +++ b/doc/component.md @@ -255,7 +255,8 @@ At this point, the component is not yet rendered. Note that a slow `willStart` m interface. Therefore, some care should be made to make this method as fast as possible. -The component rendering will take place after `willStart` is completed. +After the `willStart` method is completed, the state will be observed with a +new `Observer`. Then, the component will be rendered by `QWeb`. #### `mounted()` diff --git a/src/core/observer.ts b/src/core/observer.ts index 316c8c17..d18005cd 100644 --- a/src/core/observer.ts +++ b/src/core/observer.ts @@ -35,7 +35,7 @@ export class Observer { } observe(value: any, parent?: any): any { - if (value === null || typeof value !== "object") { + if (value === null || typeof value !== "object" || value instanceof Date) { // fun fact: typeof null === 'object' return value; } diff --git a/tests/core/observer.test.ts b/tests/core/observer.test.ts index 9506d70b..7e936845 100644 --- a/tests/core/observer.test.ts +++ b/tests/core/observer.test.ts @@ -57,6 +57,25 @@ describe("observer", () => { }); }); + test("properly handle dates", () => { + const observer = new Observer(); + const date = new Date(); + const obj: any = observer.observe({ date }); + + expect(observer.revNumber(obj)).toBe(1); + expect(observer.deepRevNumber(obj)).toBe(1); + expect(observer.rev).toBe(1); + expect(typeof obj.date.getFullYear()).toBe('number'); + expect(obj.date).toBe(date); + + obj.date = new Date(); + + expect(observer.revNumber(obj)).toBe(2); + expect(observer.deepRevNumber(obj)).toBe(2); + expect(observer.rev).toBe(2); + expect(obj.date).not.toBe(date); + }); + test("can change values in array", () => { const observer = new Observer(); const obj: any = observer.observe({ arr: [1, 2] });