У меня проблемы с выполнением синхронизации двух элементов с использованием 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