2017-08-21 35 views
0

我有一个多重选择的问题。我想按类别显示标签,但有一些具体的内容:标签可能属于一个或多个类别Angularjs:跟踪多个选择相同的对象

我的问题是在两个不同类别的标签。如何处理这个?

在这里我有什么现在:

// 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,它被选中,但不第一个。 (如果我检查“标签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。但是,你的两个项目有相同的ID,所以只有一个被检查(我不知道为什么只有第二个被检查,而不是第一个或两个)。

因此,您只需将其删除:

<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是您的plunker纠正。

+0

NG-模式选项的问题=“{trackBy:‘$ value.id’}”是用来初始化列表并检查已经选择(从数据库)的标签。用app.js中的selectedTags数组注释尝试它。也许有另外一种方法来检查数据库 –

+0

已经选择的标记(selected = true)是的,但是如果我理解了文档,使用这将使Javascript比较你的元素的id(知道它们是否被检查),但你的两件物品有相同的ID,所以其中一件永远不会被检查。 – JeanJacques

+0

因此,不要使用它,要使默认选中的项目直接在您的控制器中引用。像这样:'$ scope.selectedTags = [$ scope.tagCategories [0] .tags [0]]' – JeanJacques