如何使用另一个字符串数组过滤ng-repeat中的字符串数组?

时间:2015-12-09 10:56:00

标签: javascript angularjs angularjs-ng-repeat

我有一个我要过滤的选择元素:

<select multiple="multiple" class="span2" data-ng-model="selectedParameters">
    <option data-ng-repeat="parameter in availableParameters">
        {{parameter}}
    </option>
</select>

“availableParameters”是一个字符串数组,我可以从这里毫无问题地到达,“selectedParameters”是另一个表示UI中所选元素的字符串数组。

availableParameters = ["AAA", "BBB", "CCC", "DDD"];

我在对象图下面有另一个字符串数组(可在HTML中访问)

graph.parameters = ["AAA", "BBB"];

我试图通过“graph.parameters”过滤“availableParameters”并获得如下列表:“CCC”,“DDD”

我查看了AngularJS的文档,但看不到我的问题的示例。

我能做的就是这样:

<option data-ng-repeat="parameter in availableParameters | filter: !graph.parameters ">{{parameter}}</option>

2 个答案:

答案 0 :(得分:2)

您可以制作自定义过滤条件,以过滤掉graph.parameters以外的所有项目:

angular.module('yourModuleNameHere').filter('params', [function(){
    return function (items, filterBy) {
      return items.filter(function(currentItem){
        return filterBy.indexOf(currentItem) === -1;
      });
    };
}]);

之后您可以将其用作:

<select multiple="multiple" class="span2" data-ng-model="selectedParameters">
    <option data-ng-repeat="parameter in availableParameters | params:graph.parameters">
        {{parameter}}
    </option>
</select>

答案 1 :(得分:1)

你可以通过多种方式实现这一点,当数据发生变化时,过滤器很有用,但我认为这不是你的情况,你只需要在你的控制器中添加一个简单的商业登录...看看以下是:

&#13;
&#13;
var rawlist = ['foo', 'baz', 'bar'];
var blacklist = ['baz'];

var list = rawlist.filter(function(item) {
  return blacklist.indexOf(item) < 0;
});

console.log('available parameters are', list);
&#13;
&#13;
&#13;

所以,您的观点可以是:

&#13;
&#13;
<select ng-model="someScopeProperty" ng-options="item for item in list track by $index"></select>
&#13;
&#13;
&#13;