2013-10-31 60 views
3

我有一个效用函数NOTNULL()旨在与过滤器,像这样使用:

...| filter:notNull()" 

我需要更多的指令,这就是为什么我把它在$ rootScope中。

的问题是,我的滤波器不是called.I创建了一个示例plnkr:

http://plnkr.co/edit/Nq0iLw?p=preview

有人能帮忙吗?为什么不调用过滤器并且不过滤我的项目?

PS。在过滤器这一表达不接缝空值工作:

...| filter:{myProp:!null} 
+0

为什么不只是创建一个过滤器? –

+0

,因为我需要默认过滤器的额外功能。我只是想插入我的比较器 –

回答

4

[:更新配置在相反的时间顺序。]

UPDATE 2

首先,回答你的问题“为什么...| filter:{myProp:!null}不工作:
这是因为你试图使用的语法是(根据the docs)仅适用于字符串值(并且null不是字符串值)。

您可以创建(并连接到您的应用程序)的自定义过滤器:

app.filter("notEqual", function() { 
    return function(items, key, value) { 
     var filtered = []; 
     items.forEach(function(item) { 
      if (item && (item[key] !== undefined) 
        && (item[key] !== value)) { 
       filtered.push(item); 
      } 
     }); 
     return filtered; 
    }; 
}); 

然后从任何像这样的指令中使用它:

...| notEqual:'<keyName>':<valueToCompareAgainst> 

如:

app.directive("mytag", function() { 
    return { 
     restrict: "E", 
     template: "<div ng-repeat=\"item in myModel | notEqual:'a':null\">" 
       + " item: {{item}}" 
       + "</div>", 
     scope: { 
      myModel: "=" 
     } 
    }; 
}); 

另请参阅此其他short demo


UPDATE

这可能是一个更好的主意,使用服务或工厂的实用方法,应该是提供给多个控制器/范围,应该是定制的。例如: - 现在

app.factory("notNullFactory", function() { 
    var factory = {}; 
    factory.notNull = function(caption) { 
     return function(item) { 
      console.log(caption + " " + JSON.stringify(item)); 
      return (item !== null); 
     }; 
    }; 
    return factory; 
}); 

,您可以使用notNullFactorynotNull(...)函数来创建自定义的过滤器功能:

app.directive("mytag", function(notNullFactory) { 
    return { 
     restrict: "E", 
     template: "<div>" 
       + " <div ng-repeat=\"item in myModel | filter:notNull('Checking')\">" 
       + "  item: {{item}}" 
       + " </div>" 
       + "</div>", 
     scope: { 
      myModel: "=" 
     }, 
     link: function($scope) { 
      $scope.notNull = function(caption) { 
       return notNullFactory.notNull(caption); 
      }; 
     } 
    }; 
}); 

还参见本等short demo


这不是说你的过滤器没有被调用,而是它没有被定义。当你定义$scope.notNull时,将其设置为$rootScope.notNull,后者是undefined

相反,你可以摆脱链接财产和使用:

...| filter:$parent.notNull()... 

还参见本short demo

+0

这将工作,假设父项是rootScope。我的标签可以嵌套在其他控制器中,我可以如何做到这一点?如果我没有被误认为是ng-click,它知道如何从父范围中解析方法。 –

+0

@OvidiuBuligan:看看我更新的答案。 – gkalpak

+0

这正是我试图避免的。这将是一个通用功能,我希望它可以在任何使用过滤器的指令中使用。但我认为这也很重要,我如何到达这里。我基本上想要过滤所有非null元素(所以没有额外的功能)。这个“... | filter:{myProp:!null}”并没有削减它,它适用于除null之外的所有值。我可以使默认表达式({myProp:!null})有效吗? –