mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
+2
-8
@@ -73,6 +73,7 @@ export class Observer {
|
|||||||
}
|
}
|
||||||
if ("__owl__" in value) {
|
if ("__owl__" in value) {
|
||||||
// already observed
|
// already observed
|
||||||
|
value.__owl__.parent = parent;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Array.isArray(value)) {
|
if (Array.isArray(value)) {
|
||||||
@@ -88,12 +89,6 @@ export class Observer {
|
|||||||
this.notifyChange();
|
this.notifyChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
unobserve(target: any) {
|
|
||||||
if (target !== null && typeof target === "object") {
|
|
||||||
delete target.__owl__;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_observeObj<T extends { __owl__?: any }>(obj: T, parent?: any) {
|
_observeObj<T extends { __owl__?: any }>(obj: T, parent?: any) {
|
||||||
const keys = Object.keys(obj);
|
const keys = Object.keys(obj);
|
||||||
obj.__owl__ = { rev: 1, deepRev: 1, parent };
|
obj.__owl__ = { rev: 1, deepRev: 1, parent };
|
||||||
@@ -131,14 +126,13 @@ export class Observer {
|
|||||||
`Observed state cannot be changed here! (key: "${key}", val: "${newVal}")`
|
`Observed state cannot be changed here! (key: "${key}", val: "${newVal}")`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
self.unobserve(value);
|
|
||||||
value = newVal;
|
value = newVal;
|
||||||
self.observe(newVal, obj);
|
self.observe(newVal, obj);
|
||||||
obj.__owl__.rev!++;
|
obj.__owl__.rev!++;
|
||||||
let parent = obj;
|
let parent = obj;
|
||||||
do {
|
do {
|
||||||
parent.__owl__.deepRev++;
|
parent.__owl__.deepRev++;
|
||||||
} while ((parent = parent.__owl__.parent));
|
} while ((parent = parent.__owl__.parent) && parent !== obj);
|
||||||
self.notifyChange();
|
self.notifyChange();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+29
-12
@@ -172,18 +172,6 @@ describe("observer", () => {
|
|||||||
expect(state.a.__owl__.rev).toBe(2);
|
expect(state.a.__owl__.rev).toBe(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("properly unobserve objects in object", () => {
|
|
||||||
const observer = new Observer();
|
|
||||||
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", () => {
|
test("reobserve new object values", () => {
|
||||||
const observer = new Observer();
|
const observer = new Observer();
|
||||||
const obj: any = { a: 1 };
|
const obj: any = { a: 1 };
|
||||||
@@ -240,6 +228,35 @@ describe("observer", () => {
|
|||||||
expect(obj2.__owl__.rev).toBe(3);
|
expect(obj2.__owl__.rev).toBe(3);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("properly handle swapping elements", () => {
|
||||||
|
const observer = new Observer();
|
||||||
|
const obj: any = { a: { arr: [] }, b: 1 };
|
||||||
|
observer.observe(obj);
|
||||||
|
|
||||||
|
// swap a and b
|
||||||
|
const b = obj.b;
|
||||||
|
obj.b = obj.a;
|
||||||
|
obj.a = b;
|
||||||
|
expect(observer.rev).toBe(3);
|
||||||
|
|
||||||
|
// push something into array to make sure it works
|
||||||
|
obj.b.arr.push("blanche");
|
||||||
|
expect(observer.rev).toBe(4);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("properly handle assigning observed obj containing array", () => {
|
||||||
|
const observer = new Observer();
|
||||||
|
const obj: any = { a: { arr: [], val: "test" } };
|
||||||
|
observer.observe(obj);
|
||||||
|
|
||||||
|
obj.a = { ...obj.a, val: "test2" };
|
||||||
|
expect(observer.rev).toBe(2);
|
||||||
|
|
||||||
|
// push something into array to make sure it works
|
||||||
|
obj.a.arr.push("blanche");
|
||||||
|
expect(observer.rev).toBe(3);
|
||||||
|
});
|
||||||
|
|
||||||
test("accept cycles in observed state", () => {
|
test("accept cycles in observed state", () => {
|
||||||
const observer = new Observer();
|
const observer = new Observer();
|
||||||
const obj1: any = {};
|
const obj1: any = {};
|
||||||
|
|||||||
Reference in New Issue
Block a user