2017-10-19 15 views
0

私は、検証時に配列内の任意の2つ以上の観測値の選択値を同じにすることができない観測可能な配列(ajaxを介して作成)を持っています。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> 

これを実現する方法は、リアルタイムで検証部門に追加/削除する方法ですか?

答えて

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

@ミルファイヤー私はあなたの構造がどのように見えるか分かりませんが、どうしてそうは見えません。 jsFiddleを一緒に組み込むことができれば、もっとコードを組み込むことができます。 –

関連する問題