Двухстороннее связывание данных на наблюдаемом элементе - PullRequest
0 голосов
/ 20 сентября 2018

Я бы хотел привязать isSelected к объекту, обернутому в наблюдаемую.Я пробовал в одиночку (без заметного и все заработало)Однако, здесь, в моем компоненте, measure.isSelected всегда возвращает false, даже если флажок установлен.

          <tr *ngFor="let measure of criteriaSelectedMeasures$ | async ; let i = index">
            <td>{{measure.type}}</td>
            <td>{{measure.equipment}}</td>
            <td>{{measure.axis}}</td>
            <td>{{measure.direction}}</td>
            <td>{{measure.pr}}</td>
            <td>{{measure.section}}</td>
            <td>{{measure.agregation}}</td>
            <td>{{measure.measureType}}</td>
            <td>{{measure.qualification}}</td>
            <td>
              <p-checkbox name="criteria-measure-{{i}}" binary="true" [(ngModel)]="measure.isSelected"></p-checkbox>
            </td>
          </tr>

Внутри моего компонента:

this.criteriaSelectedMeasures$.subscribe(list => {
            this.store.dispatch(new AddMeasureDefinitionsAction(list.filter(m => m.isSelected))); <-- here isSelected is always false
        });

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

Я прав?Есть ли другой способ добиться этого?(может быть, используя ngModelChange?)

1 Ответ

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

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

Наблюдаемые часто не являются лучшими решениями в угловом измерении.В частности, они передают информацию только одним способом, и вы должны обычно рассматривать испускаемые объекты как неизменяемые, в противном случае они находятся на грани взлома.

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

Другое решение, хотя и несколько неловкое, если вы действительно хотите передать объекты как наблюдаемые, - этоиметь @Output() measureSelectionChange в вашем компоненте, где вы передаете, например, идентификатор меры и новое состояние выбора, когда флажок установлен, и что-то вне вашего компонента отвечает за фактическое изменение меры (и, возможно, повторное добавление измененного набора мер в ваш компонент).

...