mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
[FIX] store: observer array values recursively
This commit is contained in:
+7
-5
@@ -129,7 +129,9 @@ export function makeObserver(): Observer {
|
|||||||
},
|
},
|
||||||
set(newVal) {
|
set(newVal) {
|
||||||
if (!observer.allowMutations) {
|
if (!observer.allowMutations) {
|
||||||
throw new Error("State cannot be changed outside a mutation!");
|
throw new Error(
|
||||||
|
`State cannot be changed outside a mutation! (key: "${key}", val: "${newVal}")`
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if (newVal !== value) {
|
if (newVal !== value) {
|
||||||
value = newVal;
|
value = newVal;
|
||||||
@@ -169,9 +171,9 @@ export function makeObserver(): Observer {
|
|||||||
(<any>arr).__rev__ = 0;
|
(<any>arr).__rev__ = 0;
|
||||||
Object.defineProperty(arr, "__rev__", { enumerable: false });
|
Object.defineProperty(arr, "__rev__", { enumerable: false });
|
||||||
(<any>arr).__proto__ = ModifiedArrayProto;
|
(<any>arr).__proto__ = ModifiedArrayProto;
|
||||||
// for (let i = 0; i < arr.length; i++) {
|
for (let i = 0; i < arr.length; i++) {
|
||||||
// observe(arr[i]);
|
observe(arr[i]);
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function observe(value: any) {
|
function observe(value: any) {
|
||||||
@@ -212,7 +214,7 @@ export function connect(mapStateToProps) {
|
|||||||
const env = parent instanceof Component ? parent.env : parent;
|
const env = parent instanceof Component ? parent.env : parent;
|
||||||
const ownProps = Object.assign({}, props || {});
|
const ownProps = Object.assign({}, props || {});
|
||||||
const storeProps = mapStateToProps(env.store.state, ownProps);
|
const storeProps = mapStateToProps(env.store.state, ownProps);
|
||||||
const mergedProps = Object.assign(props || {}, storeProps);
|
const mergedProps = Object.assign({}, props || {}, storeProps);
|
||||||
super(parent, mergedProps);
|
super(parent, mergedProps);
|
||||||
setStoreProps(this.__widget__, storeProps);
|
setStoreProps(this.__widget__, storeProps);
|
||||||
this.__widget__.ownProps = ownProps;
|
this.__widget__.ownProps = ownProps;
|
||||||
|
|||||||
@@ -191,6 +191,18 @@ describe("observer", () => {
|
|||||||
expect(state.arr.length).toBe(1);
|
expect(state.arr.length).toBe(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("properly observe objects in array", () => {
|
||||||
|
const observer = makeObserver();
|
||||||
|
const state: any = { arr: [{ something: 1 }] };
|
||||||
|
observer.observe(state);
|
||||||
|
expect(state.arr.__rev__).toBe(0);
|
||||||
|
expect(state.arr[0].__rev__).toBe(0);
|
||||||
|
|
||||||
|
state.arr[0].something = 2;
|
||||||
|
expect(state.arr.__rev__).toBe(0);
|
||||||
|
expect(state.arr[0].__rev__).toBe(1);
|
||||||
|
});
|
||||||
|
|
||||||
test("reobserve new object values", () => {
|
test("reobserve new object values", () => {
|
||||||
const observer = makeObserver();
|
const observer = makeObserver();
|
||||||
const obj: any = { a: 1 };
|
const obj: any = { a: 1 };
|
||||||
|
|||||||
Reference in New Issue
Block a user