2017-08-21 15 views
0

私は複数の選択に問題があります。カテゴリ別にタグを表示したいが、具体的なものがある:タグは1つ以上のカテゴリに属する​​可能性があるAngularjs:複数の同じオブジェクトを選択してトラックする

私の問題は、2つの異なるカテゴリに属する​​タグです。どのようにこれに対処する?私は今のところ持っているものをここで

// vm.tagCategories 
[ 
    { 
    "id":1, 
    "name":"category 1", 
    "description":"category 1", 
    "tags": 
     [ 
     {"id":1, 
     "name":"tag 1", 
     "description":"test" 
     } 
     ] 
    }, 
    { 
    "id":3, 
    "name":"category 2", 
    "description":"category 2", 
    "tags": 
     [ 
     { 
      "id":1, 
      "name":"tag 1", 
      "description":"test" 
     }, 
     { 
      "id":2, 
      "name":"tag 2", 
      "description":"test 2" 
     } 
     ] 
    } 
] 
<md-input-container class="md-block"> 
     <label>Tags</label> 

     <md-select ng-model="vm.selectedTags" ng-model-options="{trackBy: '$value.id'}" multiple> 
      <md-optgroup label="{{currentCategories.name}}" ng-repeat="currentCategories in vm.tagCategories"> 
       <md-option ng-value="{{value}}" ng-repeat="(key, tag) in currentCategories">{{tag.name}}</md-option> 
      </md-optgroup> 
     </md-select> 
    </md-input-container> 

enter image description here

私はカテゴリ1にタグ2をチェックすると、それが確認されていないが、カテゴリ2のタグ2です最初の1つ。 (私は「タグ2」をチェックすると、これは私が持っているものである):

enter image description here

The plunker

+0

「IDでアイテムを追跡する、同じIDを持つすべてのアイテムが同じアイテムです」 – devqon

+0

私の悪い...私は最後の文章を終わらせませんでした。私の質問を編集しました –

+0

この問題を[plunker](https://plnkr.co/edit/?p=catalogue)で再現して、問題を解決できるようにしてください。 – JeanJacques

答えて

0

オプションng-model-options="{trackBy: '$value.id'}"は、方法を変更するために使用されるJavascriptをチェックモデル間の平等というselectedTagsとあなたの選択のさまざまな項目。これにより、メモリ内の同じオブジェクトであるかどうかをチェックするのではなく、同一のオブジェクトがあるかどうか比較します。idしかし、あなたのアイテムのうちの2つは同じIDを持つので、チェックされたアイテムは1つのみです(私は2番目のアイテムだけがチェックされ、最初のアイテムはチェックされません。

だから、あなたはそれを削除する必要があります:あなたのplunkerは

<md-select ng-model="selectedTags" placeholder="Select an Option" multiple> 
    <md-optgroup label="{{item.name}}" ng-repeat="item in tagCategories"> 
     <md-option ng-value="value" ng-repeat="(key, value) in item.tags">{{value.name}}</md-option> 
    </md-optgroup> 
</md-select> 

Here補正しています。

+0

ng-model-options = "{trackBy: '$ value.id'}"は、リストを初期化し、(データベースから)すでに選択されたタグをチェックするために使用されます。 app.jsでコメントされたselectedTags配列で試してみてください。多分、データベースで既に選択されているタグ(選択=真)をチェックする別の方法があります。 –

+0

はい、私はよくドキュメントを理解していれば、これを使ってJavascriptが要素のIDを比較して(チェックされているかどうかを知る) 2つのアイテムは同じIDを持つので、そのうちの1つは決してチェックされません。 – JeanJacques

+0

これを使用する代わりに、デフォルトで選択された項目をコントローラで直接参照するようにします。 '$ scope.selectedTags = [$ scope.tagCategories [0] .tags [0]]' – JeanJacques

関連する問題