2017-10-19 126 views
0

我有一個可觀察數組(通過ajax填充)驗證時,不能在數組中的任何2個或多個觀察值上具有相同的選擇值。驗證ObservableArrays之間的重複數據

<div id="AttrValidationDiv"></div> 
    <table>  
    <!-- ko foreach: AttrsViewModels --> 
     <tr> 
      <td> 
       <select data-bind="options:$root.optionsViewModel, optionsText:'ProductName', optionsValue:'ProductId',value:ServiceGroup, optionsCaption:'Select'"></select> 
      </td> 
      </tr> 
     <!-- /ko --> 
    </table> 

有沒有一種方法可以在實時添加/刪除驗證div中完成此操作?

回答

2

您可以使用計算函數來完成此操作,該函數根據AttrsViewModels中的選定選項檢查每個選項。只要選定的選項發生變化,計算器就會自動重新計算,因爲它們是可觀察的,並且如果綁定到計算函數,則div文本將被更新。

function viewModel(){ 
 
    var self = this; 
 
    
 
    this.optionsViewModel = [ 
 
    { ProductId: 1, ProductName: 'product 1' }, 
 
    { ProductId: 2, ProductName: 'product 2' }, 
 
    { ProductId: 3, ProductName: 'product 3' } 
 
    ]; 
 
    
 
    this.AttrsViewModels = ko.observableArray([ 
 
    { ServiceGroup: ko.observable() }, 
 
    { ServiceGroup: ko.observable() }, 
 
    { ServiceGroup: ko.observable() } 
 
    ]); 
 
    
 
    this.validations = ko.computed(function(){ 
 
    for(var i=0; i<self.optionsViewModel.length; i++){ 
 
    \t var option = self.optionsViewModel[i]; 
 
     var matches = self.AttrsViewModels().filter(function(item){ 
 
      return item.ServiceGroup() === option.ProductId; 
 
     }); 
 
     if(matches.length >= 2){ 
 
     \t  return option.ProductName + ' is selected more than once'; 
 
     } 
 
    } 
 
    return ''; 
 
    }); 
 
} 
 
    
 
ko.applyBindings(new viewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div id="AttrValidationDiv"> 
 
    <span data-bind="text: validations"></span> 
 
</div> 
 
<table>  
 
    <tbody> 
 
    <!--ko foreach: AttrsViewModels--> 
 
    <tr> 
 
     <td> 
 
      <select data-bind="options:$root.optionsViewModel, optionsText:'ProductName', optionsValue:'ProductId',value:ServiceGroup, optionsCaption:'Select'"></select> 
 
     </td> 
 
    </tr> 
 
    <!--/ko--> 
 
    </tbody> 
 
</table>

+0

謝謝。正是我需要的。 – Mildfire

+0

我想知道是否有可能在AttrsViewModels中引入「Level」屬性。例如:「'級別爲1的服務組已經被選定爲2,3級。」 – Mildfire

+0

@Mildfire我不確定你的結構是什麼樣子,但我不明白爲什麼不。如果你可以把一個jsFiddle與更多的代碼放在一起,我會看看。 –