Не удалось выполнить инвариант: изменение наблюдаемых наблюдаемых значений вне действий не допускается

Как я могу написать это с помощью mobx и axios? Я пытаюсь использовать функцию стрелки, чтобы сохранить область действия "this", но я могу ошибаться.

@action saveMode() {

    axios.post('/Course/Post', { Name: "test41515"})
        .then(response => {
            console.log(response, this.isEditing);
            this.isEditing = !this.isEditing;
            this.failedValidation = [];
        })

}

Uncaught (in promise) Error: [mobx] Invariant failed: Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an `action` if this change is intended. Tried to modify: Course@5.isEditing
    at invariant (app.bundle.js:7316)
    at fail (app.bundle.js:7311)
    at checkIfStateModificationsAreAllowed (app.bundle.js:7880)
    at ObservableValue.prepareNewValue (app.bundle.js:5786)
    at setPropertyValue (app.bundle.js:6663)
    at Course.set [as isEditing] (app.bundle.js:6631)
    at app.bundle.js:62336
    at <anonymous>

1 ответ

Решение

В документации MobX есть целая страница о написании асинхронных действий. Это было бы с чего начать, https://mobx.js.org/best/actions.html, и фактически первый пример - это именно та проблема, с которой вы сталкиваетесь в заметке.

В приведенном выше примере будут генерироваться исключения, поскольку обратные вызовы, передаваемые обещанию fethGithubProjectsSomehow, не являются частью действия fetchProjects, так как действия применяются только к текущему стеку.

Учитывая ваш фрагмент, самое простое решение заключается в использовании runInAction

@action saveMode() {

  axios.post('/Course/Post', { Name: "test41515"})
    .then(response => {
      runInAction(() => {
        console.log(response, this.isEditing);
        this.isEditing = !this.isEditing;
        this.failedValidation = [];
      });
    })

}
Другие вопросы по тегам