[FIX] store: observer array values recursively

This commit is contained in:
Géry Debongnie
2019-04-12 12:25:22 +02:00
parent ab12ac8a9f
commit 111080fdbf
2 changed files with 19 additions and 5 deletions
+7 -5
View File
@@ -129,7 +129,9 @@ export function makeObserver(): Observer {
},
set(newVal) {
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) {
value = newVal;
@@ -169,9 +171,9 @@ export function makeObserver(): Observer {
(<any>arr).__rev__ = 0;
Object.defineProperty(arr, "__rev__", { enumerable: false });
(<any>arr).__proto__ = ModifiedArrayProto;
// for (let i = 0; i < arr.length; i++) {
// observe(arr[i]);
// }
for (let i = 0; i < arr.length; i++) {
observe(arr[i]);
}
}
function observe(value: any) {
@@ -212,7 +214,7 @@ export function connect(mapStateToProps) {
const env = parent instanceof Component ? parent.env : parent;
const ownProps = Object.assign({}, props || {});
const storeProps = mapStateToProps(env.store.state, ownProps);
const mergedProps = Object.assign(props || {}, storeProps);
const mergedProps = Object.assign({}, props || {}, storeProps);
super(parent, mergedProps);
setStoreProps(this.__widget__, storeProps);
this.__widget__.ownProps = ownProps;
+12
View File
@@ -191,6 +191,18 @@ describe("observer", () => {
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", () => {
const observer = makeObserver();
const obj: any = { a: 1 };