Угловое Наблюдаемое матричное решение - PullRequest
0 голосов
/ 05 ноября 2019

Эта полная матрица является наблюдаемой:

DDA     DDB    DDC     DDD     DDE    DDF
A   |    B   |  C   |   D   |   E   |   F
----|--------|------|-------|-------|-------
2   |   4    |  6   |   2   |   5   |   7
3   |   3    |  6   |   0   |   6   |   8
3   |   6    |  5   |   1   |   6   |   8
5   |   0    |  1   |   1   |   1   |   5
1   |   2    |  2   |   0   |   1   |   5

Here every column is an Observable

пример ObservableA []: над столбцом AObservableB []: над столбцом B и т. Д.



And next
ObservableB[i] = ObservableA[i].pipe();
And similarly further ...

where DDA , DDB , DDC,DDD,DDE,DDF are also Observable over respective columns
ALL DROPDOWNS ARE MUTLI-SELECT

DDA -> ObservableA
DDB -> ObservableB
DDC -> ObservableC
DDD  -> ObservableD and so one

ПРОБЛЕМА:

я хочу, чтобы все раскрывающиеся списки имели уникальное значение из соответствующих столбцов

и также, если для DDA Observable мы выбрали значение 2,3 из раскрывающегося списка

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

DDB : 4,3,6
DDC : 6,5
DDD : 2,0,1
DDE : 5,6
DDF : 7,8

Это применимо для всех раскрывающихся списков. означает: если DDC изменился, то все столбцы должны измениться соответственно

Как я могу добиться этого. пожалуйста, помогите мне

1 Ответ

0 голосов
/ 05 ноября 2019

из моего комментария, если их несколько, нам нужно изменить несколько функций getLang

  //remember that array.value if the value of multiple select, e.g. ["German","Frech"]

  getLang(i, array, languageList) {
    return i == 0 ? languageList :
      this.getLang(i - 1, array, languageList.
         filter(x => !array[i-1].value || array[i-1].value.indexOf(x.name)<0))
  }

И, если изменить массив на значение, отличное от нуля, иначе удалить значения, которые в ngOnInit

this.formArray.controls.forEach(form => {
      form.get('options').valueChanges.subscribe(res => {
        res.forEach((x, index) => {
          if (index>0)
          {
            const group=(form.get('options') as FormArray).at(index);
            if (group.value) //if it's not null
            {
             //calculate in optionsSelected all the options selected before 
            let options=res.slice(0,index)
            let optionsSelected=[]
            options.forEach(x=>{
              optionsSelected=[...optionsSelected,...x]
            })
            //we make a filter
            let newValue=group.value?group.value.filter(y=>optionsSelected.indexOf(y)<0):null
            //if the result of the filter is an empty array
            //we give a null value, elese the filtered result
            group.setValue((newValue && newValue.length>0?newValue:null), { emitEvent: false })
            }
          }
        })
      })

См. стек

...