Невозможно перезаписать наблюдаемую переменную в хранилище mobx

Вот мой магазин Mobx:

import { observable } from 'mobx';
import fb from '../Firebase';
import User from '../User';

export default class Profile {

  @observable profile = {};
  @observable uid = null;

  /**
   * @return {void}
   */
  constructor(user) {
    this.user = user;
    fb.firebase.auth().onAuthStateChanged(() => {
      this.uid = user.currentUser.uid;
      fb.profiles.child(this.uid).on('value', (snapshot) => {

        // Doesn't matter what I will do here with this.profile...
        this.profile = snapshot.val();
        
      });
    });
  }
}

Попытка использовать наблюдаемое свойство профиля из наблюдателя. Но по какой-то причине я не могу получить от него обновленный статус.

Если я обновлю профиль перед "fb.profiles.child", то есть не из обратного вызова, то он будет работать.

Кто-нибудь знает, почему это происходит? Я думаю, может быть, потому что он уже подключен к наблюдателю или что-то в этом роде...


person wntsmk    schedule 22.05.2017    source источник


Ответы (2)


Чтобы правильно обновить объект, вы должны использовать observable (https://mobx.js.org/refguide/observable.html) и Object.assign для определения profile.

Вот несколько (непроверенных) примеров:

@observable profile = observable({});
.
.
.
this.profile = Object.assign({}, this.profile, snapshot.val());

Если Object.assign не запускает обновление, вам нужно использовать extendObservable() (https://mobx.js.org/refguide/extend-observable.html):

@observable profile = observable({});
.
.
.
extendObservable(profile, snapshot.val());

Другой альтернативой является использование observable.map (https://mobx.js.org/refguide/map.html) для более сложных структур:

@observable profile = observable.map({ profileData: {} });
.
.
.
const currentProfile = this.profile.get('profileData'); 
this.profile.set('profileData', Object.assign({}, currentProfile, snapshot.val()));
person Samuli Hakoniemi    schedule 23.05.2017
comment
Все равно не повезло с ним. Если я распечатаю профиль на консоль из хранилища простым методом, который я вызываю из компонента, то дата профиля будет обновленными данными в консоли, но пустым объектом в компоненте. - person wntsmk; 23.05.2017
comment
Вы когда-нибудь добились чего-нибудь с этим? - person archae0pteryx; 20.08.2017

Так что решить мой вопрос с вопросом не представляется возможным, отсутствует самая важная часть.

В компоненте был компонентWillMount. После удаления он решил мою проблему.

person wntsmk    schedule 23.05.2017