MobX и глубокая наблюдаемость - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь понять глубокую наблюдаемость в MobX. В частности, в следующем коде я бы хотел, чтобы автозапуск вызывался при каждом запуске setCommentCountForPost, но в настоящее время это не так.

Как мне исправить этот код? И, наблюдаемого на свойстве Post достаточно, чтобы активировать автозапуск, когда я читаю список, в котором содержится сообщение? (как я делаю в автозапуске)

Я использую MobX 5.

Edit: я обнаружил, что код работает правильно, если я использую следующий вызов внутри автозапуска: console.log(toJS(p.getPosts()));. Это интересно, но почему и как мне это делать, если я хочу вызвать только getPosts ()?

Это код

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


configure({ enforceActions: true });

class Post {
    @observable commentCount = 0;

    setCommentCount(c) {
        this.commentCount = c;
    }
}

class PostList {
    @observable _posts = {};

    @action createPost(id) {
        this._posts[id] = new Post();
    }

    @action setCommentCountForPost(id, c) {
        this._posts[id].setCommentCount(c);
    }

    getPosts() {
        return this._posts;
    }
}

let p = new PostList();
p.createPost(1);


autorun(function test () {
    console.log(p.getPosts());
});


p.setCommentCountForPost(1, 22);

1 Ответ

0 голосов
/ 25 августа 2018

MobX отслеживает доступ к свойству, а не значение

. В вашем примере функция автозапуска отслеживает только _posts, но не свойство _posts, поэтому если вы измените значение _posts, функция отслеживания будет работать

console.log(toJS(p.getPosts())) работал из-за функции toJS, чтобы преобразовать наблюдаемое значение в нормальное значение, он обращается к свойству _posts.

, если вы надеетесь, что p.getPosts() сработал, вы должны получить доступ ксвойство _posts.

...