подписка на mobx @observable с использованием rx js Наблюдаемый, но не переходящий на изменения в компоненте глубокого уровня (файл ts) - PullRequest
1 голос
/ 29 января 2020

Я пытаюсь получить изменения из angular -mobx store, используя rx js observable. но не получая никаких изменений, если наблюдаемый массив изменился. Но если я назначаю новое значение, используя знак '=', то я получаю изменения в подписке. Кто-нибудь может это объяснить? или помочь получить изменения только путем изменения, например, сращивания или замены объекта в массиве? спасибо

https://stackblitz.com/edit/angular-reuych DEMO APP

import { computed, action, observable } from "mobx-angular";
import {observe  } from "mobx";
import { Observable } from 'rxjs';
import { Injectable } from "@angular/core";
import * as moment from "moment-timezone";
@Injectable()
export class Store {toRx(obj, prop) {
   return Observable.create(observer =>
      observe(obj, prop, (change) => observer.next(change.newValue), true)
    );
  }
  @observable storeCampaigns:any=[];

}

затем в компоненте, подписывающемся как этот

this.store.toRx(this.store.storeCampaigns, 'campaigns')
  .subscribe(val =>  {
  console.log("calendar get change", val)

1 Ответ

0 голосов
/ 03 февраля 2020

Если вы погрузитесь глубже в mobx, вы попадете по следующей ссылке Наблюдатель , где вы можете найти следующий комментарий

/**
 * A node in the state dependency root that observes other nodes, and can be observed itself.
 *
 * ComputedValue will remember the result of the computation for the duration of the batch, or
 * while being observed.
 *
 * During this time it will recompute only when one of its direct dependencies changed,
 * but only when it is being accessed with `ComputedValue.get()`.
 *
 * Implementation description:
 * 1. First time it's being accessed it will compute and remember result
 *    give back remembered result until 2. happens
 * 2. First time any deep dependency change, propagate POSSIBLY_STALE to all observers, wait for 3.
 * 3. When it's being accessed, recompute if any shallow dependency changed.
 *    if result changed: propagate STALE to all observers, that were POSSIBLY_STALE from the last step.
 *    go to step 2. either way
 *
 * If at any point it's outside batch and it isn't observed: reset everything and go to 1.
 */

Который в значительной степени утверждает, что новое значение будет вычисляться (т. е. новая вещь поступит через подписку) только при первом обращении к значению (т. е. при подписке) или при изменении зависимостей (т. е. при изменении сохраненных ссылок, в вашем случае с помощью * Оператор 1007 * внутри магазина).

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

** Отказ от ответственности, а не mobx pro, но это то, что говорит исходный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...