ng-options根据所选值过滤

时间:2015-02-06 13:04:38

标签: angularjs angular-filters angularjs-ng-options

我已经编写了一个指令来编辑应用的标签。

每种文化(例如:en-US)每个属性最多可包含4个标签,这些标签包含在表格中:

 $scope.suffixes = ["DisplayName", "Description", "Hint", "Help"];


 <div class="clear" ng-repeat="label in labelModel | filter:cultureFilter">
      <select ng-options="suffix as suffix for suffix in suffixes | filter:suffixFilter(suffix, label.suffix)" ng-model="label.suffix" />

 </div>

这是我的控制器功能:

    $scope.cultureFilter = function (label) {
        return (label.culture == $scope.labelState.culture);
    }

    $scope.suffixFilter = function (suffix, selectedValue) {

        //arguments are now : [undefined, "DisplayName"]

        return true; // :-(
    }

到目前为止,我已经能够根据文化过滤ng-repeat。

但是对于我的ng-options,我必须过滤已经使用过的字符串。但我还必须保持选择当前值。如何判断我的过滤器是否应该过滤某些值,因为它是当前选定的值?

修改

现在,我能够收到所选的值,但我无法再接收后缀了

1 个答案:

答案 0 :(得分:2)

您几乎使用过滤功能,但在您的情况下,我认为您真正需要的是自定义过滤器。它们实际上是无足轻重的。

过滤器只是在.filter()助手注册的工厂功能。

您只需要一个接受您关注的参数

//Outer factory function
function SuffixFilter(){

  //Inner function which is our filter
  return function(items, ignoredItem){
     var filteredItems = [];

     angular.forEach(items, function(item){
        //Your filtering logic may be more complex
        // than this. It's only an example
        if(item == someCriteria || item == ignoredItem){
           filteredItems.push(item);
        }
     });

     return filteredItems;
  }
}

angular.module('myModule')
   .filter('suffixFilter', SuffixFilter);

一旦您注册了后缀过滤器,就可以使用您关心的参数在标记中调用。 Angular处理剩下的事情。

<!-- Pass in the current selection to ignore -->
suffixes | suffixFilter:label.suffix

更新 - 根据以下评论

函数参数并没有真正起作用。它期望评估一个可以被调用的函数。

技术上 您可以返回一个函数并使用闭包来完成您想要的任务。像这样:

<!-- In your markup -->
filter:suffixFilter(label.suffix)

//In your controller
$scope.suffixFilter = function (selectedValue) {

   //this is your actual filter here
   return function(item){

      //You have access to 'selectedValue' via
      // a closure
      return item == someCriteria || item === selectedValue;
   }
}

所以,虽然这当然是可能的,但我认为自定义过滤器在语义上更清晰。