仅在点击时触发过滤器
Trigger filter only on click
我有一个数据列表,这个数据是通过下拉菜单过滤的。
问题是,我希望过滤仅在单击按钮时触发,而不是在下拉列表更改时触发。
<select ng-model="annee" ng-options="annee.titre for annee in annees track by annee.id">
</select>
<input type="submit" name="submit" value="Filtrer">
<ul>
<li ng-repeat="x in accueils | filter:annee" >
{{x.titre}}
<div ng-bind-html="x.description | to_trusted"></div>
{{x.date}}
{{x.cout}} $
{{x.participants}} participants
</li>
</ul>
这是一个工作示例:
http://plnkr.co/edit/MbfrhdKfbTObybsQvxrR?p=preview
我希望在单击 "filter" 按钮时触发过滤器
可能吗?
非常感谢!
请注意,您在此处的过滤器代码与您的 Plunker 不匹配;在 Plunker 中是 filter:{annee:annee.id}
。
您想将 ng-repeat
与 ng-model
分离。一种方法是根据新 属性 进行过滤,并仅在单击“过滤”按钮时更新 属性。
在你的 HTML:
添加一个<form>
元素并设置ng-submit
在按下过滤器按钮时调用submit()
:
<form ng-app="myApp" ng-controller="customersCtrl" ng-submit="submit()">
更改 ng-repeat
过滤器以使用新的 属性 而不是 <select>
元素的 ng-model
使用的 属性:
<li ng-repeat="x in accueils | filter:{annee:currentAnnee.id}">
在你的控制器中:
创建新的 属性 并用无效的 id 初始化:
$scope.currentAnnee = {
"id": 0
};
创建一个 submit()
函数,从 <select>
元素的 ng-model
:
设置新的 属性
$scope.submit = function() {
$scope.currentAnnee = $scope.annee;
};
查看此 Plunker 以获得完整示例。
正如@msmolens 所指出的,您的 plunker 和您在此处发布的代码存在一些差异。其次,您使用的两个数组没有任何共同点,因此出于演示目的,我更改了将用作过滤器的第二个数组的结构。
首先,将数组过滤器与 select 下拉列表的模型值分离。
<select ng-model="annee" ng-options="annee.date for annee in annees track by annee.id">
</select>
<input type="submit" name="submit" value="Filtrer" ng-click="filter()">
<ul>
<li ng-repeat="x in accueils | filter:filterExpr" >
{{x.titre}}
<div ng-bind-html="x.description | to_trusted"></div>
{{x.date}}
{{x.cout}} $
{{x.participants}} participants
</li>
</ul>
如代码所示,我们在 ng-repeat 中有一个过滤器表达式的模型变量。
然后我们用空值初始化过滤器表达式。
$scope.filterExpr = {"date" : ''};
之后,您只需要捕获过滤器按钮的 ng-click 并修改用作过滤器的变量。
$scope.filter = function() {
$scope.filterExpr = {"date" : $scope.annee.date};
};
您可以找到更新的 plunker here.
我有一个数据列表,这个数据是通过下拉菜单过滤的。
问题是,我希望过滤仅在单击按钮时触发,而不是在下拉列表更改时触发。
<select ng-model="annee" ng-options="annee.titre for annee in annees track by annee.id">
</select>
<input type="submit" name="submit" value="Filtrer">
<ul>
<li ng-repeat="x in accueils | filter:annee" >
{{x.titre}}
<div ng-bind-html="x.description | to_trusted"></div>
{{x.date}}
{{x.cout}} $
{{x.participants}} participants
</li>
</ul>
这是一个工作示例:
http://plnkr.co/edit/MbfrhdKfbTObybsQvxrR?p=preview
我希望在单击 "filter" 按钮时触发过滤器
可能吗?
非常感谢!
请注意,您在此处的过滤器代码与您的 Plunker 不匹配;在 Plunker 中是 filter:{annee:annee.id}
。
您想将 ng-repeat
与 ng-model
分离。一种方法是根据新 属性 进行过滤,并仅在单击“过滤”按钮时更新 属性。
在你的 HTML:
添加一个
<form>
元素并设置ng-submit
在按下过滤器按钮时调用submit()
:<form ng-app="myApp" ng-controller="customersCtrl" ng-submit="submit()">
更改
ng-repeat
过滤器以使用新的 属性 而不是<select>
元素的ng-model
使用的 属性:<li ng-repeat="x in accueils | filter:{annee:currentAnnee.id}">
在你的控制器中:
创建新的 属性 并用无效的 id 初始化:
$scope.currentAnnee = { "id": 0 };
创建一个
设置新的 属性submit()
函数,从<select>
元素的ng-model
:$scope.submit = function() { $scope.currentAnnee = $scope.annee; };
查看此 Plunker 以获得完整示例。
正如@msmolens 所指出的,您的 plunker 和您在此处发布的代码存在一些差异。其次,您使用的两个数组没有任何共同点,因此出于演示目的,我更改了将用作过滤器的第二个数组的结构。
首先,将数组过滤器与 select 下拉列表的模型值分离。
<select ng-model="annee" ng-options="annee.date for annee in annees track by annee.id">
</select>
<input type="submit" name="submit" value="Filtrer" ng-click="filter()">
<ul>
<li ng-repeat="x in accueils | filter:filterExpr" >
{{x.titre}}
<div ng-bind-html="x.description | to_trusted"></div>
{{x.date}}
{{x.cout}} $
{{x.participants}} participants
</li>
</ul>
如代码所示,我们在 ng-repeat 中有一个过滤器表达式的模型变量。
然后我们用空值初始化过滤器表达式。
$scope.filterExpr = {"date" : ''};
之后,您只需要捕获过滤器按钮的 ng-click 并修改用作过滤器的变量。
$scope.filter = function() {
$scope.filterExpr = {"date" : $scope.annee.date};
};
您可以找到更新的 plunker here.