Работа с изменениями сложных данных с помощью BehaviorSubject - PullRequest
0 голосов
/ 16 сентября 2018

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

export class DataService {    
    private messageSource = new BehaviorSubject<Data>(this.data);
    currentMessage = this.messageSource.asObservable();
}

export class Component implements OnInit {

    message:Data;

    constructor(private data: DataService) { }

    ngOnInit() {
      this.data.currentMessage.subscribe(
        message => {
          this.message = JSON.parse(JSON.stringify(message))
        }
      )
    }
}

Данные сложны:

class Data {
    id:number
    prop1:string
    prop2:Array<{prop1:number, prop2:string}>
}

Данные изменяются со временем, и компоненты относятся только к последней версии данных. Мой вопрос: как компоненты могут знать, что именно изменило в данных, когда они получают уведомление?

Например, скажем, изменилось только одно поле одного элемента в prop2. Каждый компонент получит новые данные, но они не знают, что именно изменилось. Знание того, что изменилось, открыло бы много возможностей для оптимизации рендеринга.

Есть ли встроенный способ сделать это с BehaviorSubject? Должен ли компонент выяснять различия после получения уведомления? Как это обычно делается?

1 Ответ

0 голосов
/ 16 сентября 2018

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

Существуют другие инструменты для diff объектов, например, Вы можете проверить уменьшить библиотеки lodash, которая может удовлетворить ваши потребности. Если вы ищете deep diff в Интернете или здесь, в Stackoverflow, вы найдете дополнительную информацию по этому вопросу.

Что касается вашей конкретной проблемы, вы можете хранить самые последние Data в своих компонентах, и каждый раз, когда вы получаете новую по своей теме, вы diff ее с помощью инструмента по вашему выбору, применять свои изменения и перезаписать сохраненную Data последней.

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