почему es6 декоратор в mobx не может работать хорошо? - PullRequest
0 голосов
/ 11 июля 2019

mobx@3.1.9 использовать es6 декоратор log @ log ('some_log'), это -> контекст - это Store, но нет модели.

Декоратор плохо работает.

// mobx@3.1.9
const log = type => (target, name, descriptor) => {
  console.log(target);
  const method = descriptor.value;
  descriptor.value = (...args) => {
    console.log(type);
    let ret;
    ret = method.apply(target, args);
  };
};

class Store {
  @observable age = 20;
  model = observable.map({
    name: 'Alex',
  });

  @action
  @log('start_log')
  setData() {
    const res = { name: 'Bob' }
    this.age = 30;
    this.model.merge(res)
  }
}



error log

{constructor: ƒ, setData: ƒ, __mobxLazyInitializers: Array(1)}
age: (...)
$mobx: e {target: {…}, name: "ObservableObject@4", values: {…}, changeListeners: null, interceptors: null}
constructor: ƒ e()
setData: ƒ ()
__mobxDidRunLazyInitializers: true
__mobxLazyInitializers: [ƒ]
get age: ƒ ()
set age: ƒ (t)
__proto__: Object
}


TypeError: Невозможно прочитать свойство 'merge' из неопределенного

у цели только возраст, без модели. почему?

1 Ответ

0 голосов
/ 11 июля 2019

проблема в вашем логгере. target - это Store.prototype, а не текущий экземпляр Store. И этот прототип не имеет свойства model.

Итак, Store.prototype.model.merge(res) потерпит неудачу, потому что нет Store.prototype.model.

const log = type => (target, name, descriptor) => {
  console.log(target);
  const method = descriptor.value;
  descriptor.value = function(...args) {
    console.log(type);
    console.log(this === target, this, target);
    const ret = method.apply(this, args);
  };
};
...