我有一个效用函数NOTNULL()旨在与过滤器,像这样使用:
...| filter:notNull()"
我需要更多的指令,这就是为什么我把它在$ rootScope中。
的问题是,我的滤波器不是called.I创建了一个示例plnkr:
http://plnkr.co/edit/Nq0iLw?p=preview
有人能帮忙吗?为什么不调用过滤器并且不过滤我的项目?
PS。在过滤器这一表达不接缝空值工作:
...| filter:{myProp:!null}
我有一个效用函数NOTNULL()旨在与过滤器,像这样使用:
...| filter:notNull()"
我需要更多的指令,这就是为什么我把它在$ rootScope中。
的问题是,我的滤波器不是called.I创建了一个示例plnkr:
http://plnkr.co/edit/Nq0iLw?p=preview
有人能帮忙吗?为什么不调用过滤器并且不过滤我的项目?
PS。在过滤器这一表达不接缝空值工作:
...| filter:{myProp:!null}
[注:更新配置在相反的时间顺序。]
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;
});
,您可以使用notNullFactory
的notNull(...)
函数来创建自定义的过滤器功能:
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。
这将工作,假设父项是rootScope。我的标签可以嵌套在其他控制器中,我可以如何做到这一点?如果我没有被误认为是ng-click,它知道如何从父范围中解析方法。 –
@OvidiuBuligan:看看我更新的答案。 – gkalpak
这正是我试图避免的。这将是一个通用功能,我希望它可以在任何使用过滤器的指令中使用。但我认为这也很重要,我如何到达这里。我基本上想要过滤所有非null元素(所以没有额外的功能)。这个“... | filter:{myProp:!null}”并没有削减它,它适用于除null之外的所有值。我可以使默认表达式({myProp:!null})有效吗? –
为什么不只是创建一个过滤器? –
,因为我需要默认过滤器的额外功能。我只是想插入我的比较器 –