使用单个 ng-model 过滤结果并显示过滤方法
Use a single ng-model to filter results and display filter method
我有一个 HTML select 元素,它提供了一些关于如何对列表进行排序的选项,它看起来像这样:
<select ng-init="sortMethod=sortMethods[0]" ng-model="sortMethod">
<option ng-repeat="sortMethod in sortMethods">{{sortMethod}}</option>
</select>
这里是 sortMethod:
$scope.sortMethods = ['created', 'likes.count'];
我正在使用 sortMethod 对一堆对象进行排序:
<li ng-repeat="story in feedData|orderBy:sortMethod">
Panel Count: {{story.frameURIs.length}}
</li>
所有这些工作正常,但问题是 select 框中的选项很难看,它显示 "created" 和 'likes.count",但它应该说 "Most Recent" 和 "Most Popular".
我尝试将 sortMethod 更改为对象数组,如下所示:
$scope.sortMethods = [{'displayVal': 'Most Recent', 'sortVal': 'created'}, {'displayVal': 'Most Popular', 'sortVal': 'likes.count'}];
并在 select
元素中显示 sortMethod.displayVal
,并使用 <li ng-repeat="story in feedData|orderBy:sortMethod.sortVal"
但这似乎以看似随机的顺序对它们进行了排序。如何在不更改 feedData 中的信息的情况下制作漂亮的 select 选项? feedData来自另一方,我无法更改。
您的思考方向正确 - 即为 sortMethods
创建合适的视图模型。
您应该看看如何使用 ng-options
为您的 select 生成选项。它允许您设置显示值以及 selected 对象是什么。
具体来说,对于您的情况,您可以 select 整个 sortMethod
对象(这将分配给 ngModel
),但显示 sortMethod.displayVal
的标签。然后,您可以在过滤本身中使用 sortVal
。
所以,它可能看起来像这样:
<select ng-model="selectedSortMethod"
ng-options="sortMethod as sortMethod.displayVal for sortMethod in sortMethods">
</select>
<li ng-repeat="story in feedData|orderBy:selectedSortMethod.sortVal">
Panel Count: {{story.frameURIs.length}}
</li>
然后在控制器中:
// as you did in your example
$scope.sortMethods = [
{displayVal: 'Most Recent', sortVal: 'created'},
{displayVal: 'Most Popular', sortVal: 'likes.count'}
];
$scope.selectedSortMethod = $scope.sortMethods[0];
我有一个 HTML select 元素,它提供了一些关于如何对列表进行排序的选项,它看起来像这样:
<select ng-init="sortMethod=sortMethods[0]" ng-model="sortMethod">
<option ng-repeat="sortMethod in sortMethods">{{sortMethod}}</option>
</select>
这里是 sortMethod:
$scope.sortMethods = ['created', 'likes.count'];
我正在使用 sortMethod 对一堆对象进行排序:
<li ng-repeat="story in feedData|orderBy:sortMethod">
Panel Count: {{story.frameURIs.length}}
</li>
所有这些工作正常,但问题是 select 框中的选项很难看,它显示 "created" 和 'likes.count",但它应该说 "Most Recent" 和 "Most Popular".
我尝试将 sortMethod 更改为对象数组,如下所示:
$scope.sortMethods = [{'displayVal': 'Most Recent', 'sortVal': 'created'}, {'displayVal': 'Most Popular', 'sortVal': 'likes.count'}];
并在 select
元素中显示 sortMethod.displayVal
,并使用 <li ng-repeat="story in feedData|orderBy:sortMethod.sortVal"
但这似乎以看似随机的顺序对它们进行了排序。如何在不更改 feedData 中的信息的情况下制作漂亮的 select 选项? feedData来自另一方,我无法更改。
您的思考方向正确 - 即为 sortMethods
创建合适的视图模型。
您应该看看如何使用 ng-options
为您的 select 生成选项。它允许您设置显示值以及 selected 对象是什么。
具体来说,对于您的情况,您可以 select 整个 sortMethod
对象(这将分配给 ngModel
),但显示 sortMethod.displayVal
的标签。然后,您可以在过滤本身中使用 sortVal
。
所以,它可能看起来像这样:
<select ng-model="selectedSortMethod"
ng-options="sortMethod as sortMethod.displayVal for sortMethod in sortMethods">
</select>
<li ng-repeat="story in feedData|orderBy:selectedSortMethod.sortVal">
Panel Count: {{story.frameURIs.length}}
</li>
然后在控制器中:
// as you did in your example
$scope.sortMethods = [
{displayVal: 'Most Recent', sortVal: 'created'},
{displayVal: 'Most Popular', sortVal: 'likes.count'}
];
$scope.selectedSortMethod = $scope.sortMethods[0];