2

我必须编写一个指令来编辑应用程序的标签。

每种文化(例如: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,我必须过滤已经使用的字符串。但我还必须保持选择当前值。如何告诉我的过滤器某些值不应该被过滤,因为它是当前选择的值?

编辑

现在,我可以接收选定的值,但我不能再接收我的后缀了

4

1 回答 1

4

您几乎可以使用过滤器功能,但就您而言,我认为您真正需要的是自定义过滤器。它们实际上是微不足道的。

.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;
   }
}

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

于 2015-02-06T13:43:25.563 回答