Redux +修改状态outsite reducer + angular

时间:2017-11-17 08:31:28

标签: angular typescript redux

有一些我无法用redux获得的东西。我正在一个有角度的项目中使用ngRedux。

假设我有一家商店:

export interface IState {
    myVar: any
}

export const INITIAL_STATE: IState {
    myVar: {
        value1: 0,
        value2: true
    }
}

如果我使用@select装饰器获得商店的这一块并订阅了observable:

@select('myVar') myVar$;

ngOnInit() {
    myVar$.subscribe((myvar) => {
        console.log("myVar changed")
    })
}

是什么阻止我这样做:

@select('myVar') myVar$;

ngOnInit() {
    myVar$.subscribe((myvar) => {
        myvar.value2 = false; // <= This Modify the state
    })
}

我同意我永远不应该这样做,这仅仅是为了目的,但有没有办法防止这样做? 也许告诉ngRedux返回readonly myVar或其他东西,因为在一个更复杂的例子中,很容易搞砸这样的商店。

我的实际问题:

public class AnotherClass {

    protected value1: number;
    protected value2: boolean;

    constructor(obj: any) {
        this.value1 = obj.value1;
        this.value2 = obj.value2;
    }
}

public class MyVarWrapper: extends AnotherClass {

    constructor(myvar: any) {
        super(myvar);

        this.value2 = false; // <= [1] Modifying value2
    }
}

@select('myVar') myVar$;

ngOnInit() {
    myVar$.subscribe((myvar) => {
        let wrapper = new MyVarWrapper(myvar); // <= [2] Because of [1] modify the state
    });
}

因为所有这些都是引用,所以商店被修改了,我希望IDE的编译器告诉我,我搞砸了。 或者更好的是,redux返回给我这个var的副本,我可以使用和修改它,而不会冒险修改我的状态。

1 个答案:

答案 0 :(得分:2)

也许这个图书馆会有所帮助: https://github.com/buunguyen/redux-freeze

它是Redux中间件,可防止状态在应用程序的任何位置发生变异。

还有替代图书馆: https://github.com/brandonroberts/ngrx-store-freeze