Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度ng重复多个选择字段,而不通过ng选项显示已选择的数据_Javascript_Angularjs_Angularjs Ng Repeat_Ng Options - Fatal编程技术网

Javascript 角度ng重复多个选择字段,而不通过ng选项显示已选择的数据

Javascript 角度ng重复多个选择字段,而不通过ng选项显示已选择的数据,javascript,angularjs,angularjs-ng-repeat,ng-options,Javascript,Angularjs,Angularjs Ng Repeat,Ng Options,所以问题的概述;我正在从api检索数据并为其创建CRUD页面。数据有一组用户可以选择的标签 下面是一个代表我的问题的代码示例。用户选择的标签由用户表示。标签关系和可选择的可用标签总数由用户.父.祖父母.标签表示 我可以同步所选内容。我似乎不明白的是,如何去掉已经从任何其他后续选择字段的选项列表中选择的选项 angular.module('app',[]) .controller('select'、['$scope'、'$filter'、'$location', 函数($scope、$filte

所以问题的概述;我正在从api检索数据并为其创建CRUD页面。数据有一组用户可以选择的标签

下面是一个代表我的问题的代码示例。用户选择的标签由
用户表示。标签
关系和可选择的可用标签总数由
用户.父.祖父母.标签
表示

我可以同步所选内容。我似乎不明白的是,如何去掉已经从任何其他后续选择字段的选项列表中选择的选项

angular.module('app',[])
.controller('select'、['$scope'、'$filter'、'$location',
函数($scope、$filter、$location){
$scope.user={
“家长”:{
“祖父母”:{
“标签”:[{
“id”:28,
“名称”:“标签1”,
}, {
“id”:17,
“名称”:“标签2”,
}, {
“id”:39,
“名称”:“标签3”,
}, {
“id”:77,
“名称”:“标签4”
}, {
“id”:100,
“名称”:“标签5”
}]
}
},
“标签”:[{
“id”:28,
“名称”:“标签1”,
“元”:{
“分数”:3分
}
}, {
“id”:17,
“名称”:“标签2”,
“元”:{
“分数”:5分
}
}]
};
}
]);

标签
分数
1(最低)
2.
3.
4.
5(最高)
添加标签

您可以使用ng repeat中的过滤功能来实现这一点,下面是一个示例代码笔,向您展示了如何:

您需要在重复定义中传递过滤器:

<select ng-model="user.labels[$index]" ng-options="department.name for department in user.parent.grandparent.labels | filter:removeSelected track by department.id ">
尽管我认为您缺少一个用例,即您希望能够将当前选定的标签包含在选项中,但通过删除所有选定的选项,您正在删除该功能

更新:

好吧,那么在考虑了这个问题之后,我提出了以下过滤器,它可以优化,但看起来确实像预期的那样工作:

.filter('duplicatesFilter', function() {
        return function(items, index, selected) { 
          var res = [selected[index]];
          _.forEach(items, function(item){
            if(!_.find(selected, function(label) {
              return label.id === item.id;
            })){
              res.push(item);
            }
          });

          return res;
        };
    })
像这样使用它:

<select ng-model="user.labels[$index]" ng-options="department.name for department in user.parent.grandparent.labels | duplicatesFilter:$index:user.labels track by department.id "></select>

这是我已经打了几次的东西,每次我都在努力解决它。如果我能找到一个能更好地解决问题的自定义过滤器,我会稍后再看,如果我不能,我会整理这段代码并发布一个;然而,这对于您的用例来说应该是很好的

工作代码笔:


您是否在ng选项中使用过滤器查看了其他stackoverflow问题?就像这个:是的,这就是我遇到的问题。我会过滤所选结果,但它们不再在选择中:(它对已创建的字段有效,但当您尝试添加标签时无效:(.今天晚些时候,我将尝试仔细查看代码,看看是否可以调整。但这已经让我更进一步,谢谢:).我不敢相信现在还没有解决方案,这似乎是一个常见的问题。所以我把它插入我的应用程序,它工作得很好。不知道密码笔出了什么问题,但非常感谢!我欠你一杯啤酒好先生!
<select ng-model="user.labels[$index]" ng-options="department.name for department in user.parent.grandparent.labels | duplicatesFilter:$index:user.labels track by department.id "></select>