Rx Js Динамически обновлять список подписчиков - PullRequest
0 голосов
/ 23 марта 2020

У меня проблемы с выполнением синхронизации двух элементов с использованием Rx JS, а также с динамическим c обновлением Observables и Subjects.

У меня есть форма с двумя списками Владелец и Сотрудник . Каждый список состоит из нескольких одинаковых компонентов, представляющих людей. Каждый такой компонент имеет (для простоты) Имя поле ввода и кнопку, чтобы удалить его из списка.

Если я добавлю элемент в список Владельцев, этот элемент также должен быть добавлен в список сотрудников и так как они оба представляют одно и то же лицо. Если я обновлю одно из полей в элементе, другое тоже нужно обновить (пример: обновить имя).

Списки полностью независимы друг от друга, поэтому компонент, представляющий персона А в списке Владельцы , может находиться в индексе 0 списка владельцев, поэтому будет иметь id="Owner_0" (и соответствующее имя идентификатору), в то время как в списке Employee он может иметь индекс 2, поэтому id="Employee_2".

Я написал код, который выполняет синхронизацию, подобную этой, и по мере того, как я заранее создаю все шаблоны, я знаю индекс элементов перед тем, как создать тему, поэтому я могу просто передать их объекту.

sources = [$('#owner_1'), $('#employee_1')];

const subject = new rxjs.Subject();

subject.subscribe({
  next: (v) => {
      var value = v.target.value;
      $('#owner_1').val(value); // the owner_1 would be replaced with some outside variable 
  }
});

subject.subscribe({
  next: (v) => {
      var value = v.target.value;
      $('#employee_1').val(value);
  }
});

rxjs.fromEvent(sources, "change").subscribe(subject);

Проблема

Однако проблема возникает, когда у меня есть сценарий, описанный ниже, и я пытаюсь по какой-то причине удалить сотрудника A из списка сотрудников. При отправке формы в индексах списка не должно быть никаких дыр - поэтому я не могу иметь в списке элементов Employees с индексами 0 и 2, но они должны быть последовательными.

Поэтому при удалении Мне нужно сместить Employee с index: 2 на index: 1, что я делаю, выполняя замену атрибутов name и id. Однако старый субъектный подписчик все еще остается, что приводит к тому, что Лицо A (от Владельцев) и Лицо C (от Сотрудников) связываются вместе и обновляются одновременно.

Вопрос : Есть ли способ также обновить подписчика или тему, или мне нужно разорвать весь объект и создать новый на основе некоторых fake guid элементов? Есть ли что-нибудь лучше, чем Тема , которую я мог бы использовать для этой цели?

INITIAL STATE:

    **OWNERS**
    Index: 0 Represents: Person A

    **EMPLOYEES**
    Index: 0 Represents: Person B
    Index: 1 Represents: Person A
    Index: 2 Represents: Person C

ACTION: Remove Person A from Employees

STATE POST-DELETION:
    **OWNERS**
    Index: 0 Represents: Person A

    **EMPLOYEES**
    Index: 0 Represents: Person B
    Index: 1 Represents: Person C

RESULT: Person A and C are bound together and update whenever a single onchange action occurs on any of these two elements
...