diff --git a/src/store.ts b/src/store.ts index e552a7ae..e2bef7b9 100644 --- a/src/store.ts +++ b/src/store.ts @@ -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 { (arr).__rev__ = 0; Object.defineProperty(arr, "__rev__", { enumerable: false }); (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; diff --git a/tests/store.test.ts b/tests/store.test.ts index 836c9904..efb499f0 100644 --- a/tests/store.test.ts +++ b/tests/store.test.ts @@ -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 };