Angular2 / Typescript / ngRx - TypeError:无法分配给对象的只读属性

时间:2017-06-27 16:40:23

标签: javascript angular typescript redux ngrx

在构造函数中,我做了类似这样的事情

let REPEATS = 1e7;

function play() {
    let start = undefined;
    let count = undefined;
    let elapsedWhile = undefined;
    let elapsedDo = undefined;
    let x = undefined;

    start = Date.now();
    count = REPEATS;
    while(count >0) {
        x = Math.sqrt(Math.random());
        count -= 1;
    }
    elapsedWhile = Date.now() - start;

    start = Date.now();
    count = REPEATS;
    do {
        x = Math.sqrt(Math.random());
        count -= 1;
    }while(count >0);    
    elapsedDo = Date.now() - start;

    console.log(elapsedWhile, elapsedDo);

}

function init() {
    xreport ('OK');
    var formx = document.getElementById("f1");;
    formx.X.addEventListener('click', play);
}

在另一个按下按钮时调用的函数中,我执行以下操作:

selectedDate: Object;
// construtor
this.selectedDate = {};
this.selectedDate['date'] = new Date();
this.selectedDate['pristine'] = new Date();

我收到以下错误:

  

TypeError:无法分配给只读属性' date'对象' [对象]'

2 个答案:

答案 0 :(得分:6)

对Ryan Q的信任:

正如Ryan评论的那样,我在我的应用程序中使用了ngRx,而我确实通过一个动作将this.selectedDate对象传递到了商店,因此我无法修改存储在State中的对象。

解决此问题的一种方法是传递新的对象引用,这应解决问题:

this.store.dispatch(new settime.DateChangeAction(Object.assign({}, this.selectedDate)));

答案 1 :(得分:2)

@维卡斯'回答让我走上了解决类似问题的正确轨道。

我试图处理上传,我想在其中显示进度:
  - 从UploadComponent,我向父母发出一个事件   - 父母向商店发送行动
  - 一个效果捕获操作,调用服务上传文件(返回一个包含两个observables的数组:progress$result$
  - 效果调度包含可观察

HttpProgress动作

此时我遇到了类似的问题。在深入了解商店冻结代码后,我和同事发现它也冻结了action.payload。因此,将可观察的结果传递给错误,因为可观察状态在内部发生变异。

使用有效负载将其保存到商店中,这样我就可以在我的组件中注册操作$所以这里我不会感到无所谓可变对象进入有效载荷。为了避免这个错误,我只是将observable包装成函数,因为深度冻结不会冻结函数。