0

단일 선택과 다중 선택 둘 다의 다중 드롭 다운을 생성하는 knockout foreach 바인딩이 있습니다. 나는 거기에 얼마나 많은 드롭 다운이있을 지 미리 알지 못한다.knockoutjs - 동일한 selectedOptions/value observableArray를 사용하는 여러 개의 드롭 다운

모든 드롭 다운은 동일한 데이터 유형의 항목으로 채워지지만 필터링되지만 하나의 observableArray에서 모든 드롭 다운의 모든 선택된 항목을 수집하려고합니다. foreach 루프의 모든 드롭 다운에 동일한 observableArray를 바인딩하면 observableArray에 추가되고 다른 드롭 다운에서 즉시 삭제되므로 작동하지 않습니다.

<script id="multiselect" type="text/html"> 
    <select class="multi-select" multiple="multiple" data-bind="options: Items, optionsText: 'Name', optionsValue: 'Guid', selectedOptions: $root.selectedItems"></select> 
</script> 
<script id="singleselect" type="text/html"> 
    <select class="single-select" data-bind="options: Items, value: $root.selectedItems"></select> 
</script> 

<div class="separator"> 
    <!-- ko foreach: distinctItemTypes --> 
    <label data-bind="text: ItemType.Name"></label> 
    <div> 
     <!-- ko template: { name: Count > 1 ? 'multiselect' : 'singleselect' } --><!-- /ko --> 
    </div> 
    <!-- /ko --> 
</div> 

이 방법이 가능합니까? 아니면 이것을 수행하는 가장 좋은 방법은 무엇입니까?

답변

0

은 현재 이상 반복하고있는 항목에 포함 된 그 선택된 값에 대해 다른 observableArrayselect 바인딩을 가지고, 다음 함께 모두 가져 루트 수준에서 computed observable을 추가

var distinctItemType = function() { 
    this.selectedOptions = ko.observableArray(); 
} 

var vm = function() { 
    var self = this; 

    this.distinctItemTypes = ko.observableArray(); 

    this.allSelectedOptions = ko.computed(function() { 
    var ret = []; 
    for (var x = 0; x < self.distinctItemTypes().length; x++) 
     ret = ret.concat(self.distinctItemTypes()[x].selectedOptions()); 

    return ret; 
    }); 
} 
+0

를 예를 제외하고 드롭 다운 수가 정적 인 경우에만 작동합니다. 내게는 1, 2, 5 또는 그 이상의 드롭 다운이있을 수 있습니다. – Sander

+0

각'select '가 바운드 된 것을 개별적으로 변경하는 방법이 있습니까? 더 많은 뷰 모델을 보는 것이 도움이 될 수 있습니다. –

+0

@Sander 특히, 'distinctItemTypes'는 무엇으로 구성되어 있습니다. 각 항목 유형에 선택한 옵션 바인딩을 두는 것이 갈 길이 될 것이라고 생각합니다. 루트 레벨에서 모두 가져 오는 것과 비슷한 것을 사용합니다. –