mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
+17
-8
@@ -108,9 +108,15 @@ export class Observer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
set(target: any, key: number | string, value: any) {
|
set(target: any, key: number | string, value: any) {
|
||||||
this.rev++;
|
let alreadyDefined =
|
||||||
|
key in target &&
|
||||||
|
Object.getOwnPropertyDescriptor(target, key)!.configurable === false;
|
||||||
|
if (alreadyDefined) {
|
||||||
|
target[key] = value;
|
||||||
|
} else {
|
||||||
this._addProp(target, key, value);
|
this._addProp(target, key, value);
|
||||||
target.__owl__.rev++;
|
this._updateRevNumber(target);
|
||||||
|
}
|
||||||
this.notifyChange();
|
this.notifyChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,23 +151,26 @@ export class Observer {
|
|||||||
},
|
},
|
||||||
set(newVal) {
|
set(newVal) {
|
||||||
if (newVal !== value) {
|
if (newVal !== value) {
|
||||||
self.rev++;
|
|
||||||
if (!self.allowMutations) {
|
if (!self.allowMutations) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Observed state cannot be changed here! (key: "${key}", val: "${newVal}")`
|
`Observed state cannot be changed here! (key: "${key}", val: "${newVal}")`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
self._updateRevNumber(obj);
|
||||||
value = newVal;
|
value = newVal;
|
||||||
self.observe(newVal, obj);
|
self.observe(newVal, obj);
|
||||||
obj.__owl__.rev!++;
|
|
||||||
let parent = obj;
|
|
||||||
do {
|
|
||||||
parent.__owl__.deepRev++;
|
|
||||||
} while ((parent = parent.__owl__.parent) && parent !== obj);
|
|
||||||
self.notifyChange();
|
self.notifyChange();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.observe(value, obj);
|
this.observe(value, obj);
|
||||||
}
|
}
|
||||||
|
_updateRevNumber(target: any) {
|
||||||
|
this.rev++;
|
||||||
|
target.__owl__.rev!++;
|
||||||
|
let parent = target;
|
||||||
|
do {
|
||||||
|
parent.__owl__.deepRev++;
|
||||||
|
} while ((parent = parent.__owl__.parent) && parent !== target);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -230,6 +230,26 @@ describe("observer", () => {
|
|||||||
expect(obj2.__owl__.rev).toBe(3);
|
expect(obj2.__owl__.rev).toBe(3);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("can set a property more than once", () => {
|
||||||
|
const observer = new Observer();
|
||||||
|
const obj: any = {};
|
||||||
|
|
||||||
|
observer.observe(obj);
|
||||||
|
expect(obj.__owl__.rev).toBe(1);
|
||||||
|
expect(observer.rev).toBe(1);
|
||||||
|
expect(obj.__owl__.deepRev).toBe(1);
|
||||||
|
|
||||||
|
observer.set(obj, "aku", "always finds annoying problems");
|
||||||
|
expect(observer.rev).toBe(2);
|
||||||
|
expect(obj.__owl__.rev).toBe(2);
|
||||||
|
expect(obj.__owl__.deepRev).toBe(2);
|
||||||
|
|
||||||
|
observer.set(obj, "aku", "always finds good problems");
|
||||||
|
expect(observer.rev).toBe(3);
|
||||||
|
expect(obj.__owl__.rev).toBe(3);
|
||||||
|
expect(obj.__owl__.deepRev).toBe(3);
|
||||||
|
});
|
||||||
|
|
||||||
test("properly handle swapping elements", () => {
|
test("properly handle swapping elements", () => {
|
||||||
const observer = new Observer();
|
const observer = new Observer();
|
||||||
const obj: any = { a: { arr: [] }, b: 1 };
|
const obj: any = { a: { arr: [] }, b: 1 };
|
||||||
|
|||||||
Reference in New Issue
Block a user