使用单个 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];

Plunker