Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么MobX允许我在没有@action的情况下更改此属性?_Javascript_Mobx - Fatal编程技术网

Javascript 为什么MobX允许我在没有@action的情况下更改此属性?

Javascript 为什么MobX允许我在没有@action的情况下更改此属性?,javascript,mobx,Javascript,Mobx,为什么严格模式下的MobX允许我更改从构造函数调用的toggle方法的标志?它不应该告诉我“mobx处于严格模式,您应该使用动作”吗 代码如下 import { useStrict, configure, autorun } from 'mobx'; import { observable, action, computed } from 'mobx'; configure({ enforceActions: true }); class Test { @observable f

为什么严格模式下的MobX允许我更改从构造函数调用的toggle方法的标志?它不应该告诉我“mobx处于严格模式,您应该使用动作”吗

代码如下

import { useStrict, configure, autorun } from 'mobx';
import { observable, action, computed } from 'mobx';


configure({ enforceActions: true });


class Test {
    @observable flag = false;

    constructor() {
        this.toggle();
    }

    toggle() {
        this.flag = !this.flag;
    }
}

var t = new Test();

autorun(function test () {
    console.log("fired: " + t.flag);  //prints fired: true
});

多亏了@ChrisEdgington,属性只有在调用构造函数之后才变成可观察的,这也是合乎逻辑的,因为在调用构造函数之前对象是不存在的

您基本上只是两次初始化
标志
字段,我建议您不要这样做

class Test {
    @observable flag = true;
}
// is the same as:
class Test {
    @observable flag;
    constructor() {
        this.flag = true;
    }
}

因此,只需使用一种方式,而不是两种方式。

您使用的是什么版本的mobx?我使用的是mobx 4.1.1Hmmm,我刚刚将配置添加到我的代码中,并立即在控制台中看到:
由于启用了严格模式,因此不允许在操作之外更改观察到的值。如果要进行此更改,请将代码包装在“操作”中。试图修改:ObservableObject@1.playSpots[..].state
但是,我的状态更改不在类构造函数中。在构造函数执行期间,可能没有应用严格性。根据对observeValue.ts中代码的通读,在我看来,在构造函数完成之前,您的可观察属性是不可观察的。