我做了一个jsfiddle来表明我的问题。 fisrt部分正在以局部方式工作。请参阅第15行。我将谓词放在过滤器中(谓词是l_name)并且正在运行。该表按“姓氏”列进行过滤。
<tr ng-repeat="item in items | filter:{l_name:myInput}">
当我使用select(名为mySelect2的模型)来选择我要过滤的谓词时,样本的第二部分不起作用(参见第36行)。
我要做的是使用select来选择谓词列和要在该列中过滤的输入。
<tr ng-repeat="item in items | filter:{mySelect2:myInput2}">
我是否遗漏了某些内容或者select(mySelect2)的绑定必须更新表格中的过滤器?
感谢您的帮助!
PS:在输入中键入jo。
答案 0 :(得分:3)
这里有一些选项:http://jsfiddle.net/jgoemat/tgKkD/1/
您可以使用模型上的对象(此处为“搜索”)作为过滤器,并为l_name和f_name分隔输入框。这样您不仅可以对两者进行过滤,还可以对两者进行过滤:
any: <input ng-model="search.$"/><br/>
l_name: <input ng-model="search.l_name"/><br/>
f_name: <input ng-model="search.f_name"/><br/>
<!-- skipping code -->
<tr ng-repeat="item in items|filter:search">
内置过滤器可以将函数作为参数,如果应包含该对象,则该参数应返回true。此函数将要过滤的对象作为其唯一参数,如果应包含该参数,则返回true。 HTML:
<tr ng-repeat="item in items|filter:filterFunc">
控制器功能:
$scope.filterFunc = function(obj) {
// property not specified do we want to filter all instead of skipping filter?
if (!$scope.mySelect)
return obj;
if (obj[$scope.mySelect].toLowerCase().indexOf($scope.myInput.toLowerCase()) >= 0)
return obj;
return false;
};
此过滤器函数将整个列表作为参数并返回已过滤的列表。这需要您创建角度模块并在ng-app
标记中指定它,如ng-app="MyApp"
Html:
<tr ng-repeat="item in items|MyFilter:mySelect:myInput">
代码:
var app = angular.module('MyApp', []);
app.filter('MyFilter', function() {
return function(list, propertyName, value) {
console.log('MyFilter(list, ', propertyName, ', ', value, ')');
// property not specified do we want to filter all instead of skipping filter?
if (!propertyName)
return list;
var newList = [];
var lower = value.toLowerCase();
angular.forEach(list, function(v) {
if (v[propertyName].toLowerCase().indexOf(lower) >= 0)
newList.push(v);
});
return newList;
}
});
内置的filter
过滤器表达式不允许您使用任何表达式,但ng-show
这样做可以限制可见项目,如下所示:
<tr ng-show="item[mySelect].toLowerCase().indexOf(myInput.toLowerCase()) >= 0 || !mySelect" ng-repeat="item in items">
我认为选项1简单灵活。如果您更喜欢下拉+字段UI,那么我认为选项3是最有用的,您可以将其重新用作其他应用程序中的依赖项:
var app = angular.module("NewApp", ["MyApp"]);
我只想把它命名为'filterByNamedProperty'。选项2很简单,但它与您的控制器相关联。选项4很乱,我不会用它。
答案 1 :(得分:0)
使用自定义过滤器怎么样?用户将属性与标准连接(例如last:jo)。在过滤器中,拆分冒号,并使用第一部分作为属性名称,第二部分作为标准。
答案 2 :(得分:0)
您可以将范围变量传递给过滤器:
<tr ng-repeat="item in items | filter:myScopeVariable">
这意味着您可以在控制器中定义过滤器对象,过滤器将使用它:
$scope.$watch('mySelect2', function(val){
$scope.myScopeVariable = {};
$scope.myScopeVariable[val] = $scope.myInput2;
});
$scope.$watch('myInput2', function(val){
$scope.myScopeVariable = {};
$scope.myScopeVariable[$scope.mySelect2] = $scope.myInput2;
});