由2个不同的选择框触发的多种操作

问题描述:

我需要在两个不同的数据网格列上实施2种不同的排序操作,通过使用2个不同的选择框变得很难。我试着用下面的代码,我新来这个我无法解决了这个...由2个不同的选择框触发的多种操作

In HTML: 

<select ng-model="reverse"> 
      <option value="false">Top Sr</option> 
      <option value="true">Bottom Sr</option> 
</select> 

<select ng-model="reverse"> 
      <option value="false">Top Rank</option> 
      <option value="true">Bottom Rank</option> 
</select> 


In datagrid: 

<tr ng-repeat="items in empList | orderBy : ['-TR', 'SR']" > 


In controller: 

In controller : $scope.reverse = false; 
+0

请向我们展示'empList'对象的外观。多一点解释也会很好 - 你想首先按列'Sr'排序然后'排序',或者在排序过程中最后一次更改的值是否具有更高的优先级?顺便说一下,我认为,你不应该将同一个模型绑定到两个不同的下拉列表中。我认为你应该为它们设置不同的模型。 – Keammoort

我会建议您以下解决方案:

<select ng-model="sr"> 
      <option value="+sr">Top Sr</option> 
      <option value="-sr">Bottom Sr</option> 
</select> 

<select ng-model="tr"> 
      <option value="+tr">Top Rank</option> 
      <option value="-tr">Bottom Rank</option> 
</select> 

那么你应该适用以下NG-repeat语句表:

<tr ng-repeat="items in empList | orderBy : [tr, sr]" > 

,还可以设置默认值控制器:

$scope.sr = '+sr'; 
$scope.tr = '+tr'; 

您应该用您想要排序的对象(来自empList的单个元素)属性名称替换'sr'和'tr'。

当您通过在选择中选择其他选项来修改$范围内的变量,然后它会自动评价,分为正确的排序依据的语句,例如:

<tr ng-repeat="items in empList | orderBy : [sr, tr]" > 

这里被更新plunker。我修改了属性名为'tr',现在它可以工作,但我不确定这是否是你想要的 - >目前它会按第一列排序,只有当值相等时,它才会比较对象财产(这是'tr')。

UPDATE:

如果你想永远排序与最近改变下拉关联的属性,那么你需要改变一个位(another plunker):

1)添加此初始化:

$scope.srRecentlyChanged = true; 

2)添加事件选择变化:

<select ng-model="sr" ng-change="srRecentlyChanged = true;"> 
      <option value="+sr">Top Sr</option> 
      <option value="-sr">Bottom Sr</option> 
</select> 

<select ng-model="tr" ng-change="srRecentlyChanged = false;"> 
      <option value="+tr">Top Rank</option> 
      <option value="-tr">Bottom Rank</option> 
</select> 

3)修改orderBy表达式:

<tr ng-repeat="items in empList | orderBy : (srRecentlyChanged? sr : tr)" > 
+0

嗨,谢谢你的解决方案,试着用一个plunker http://plnkr.co/edit/pEbvGeag9xYHy5O3VMZn?p=preview。有些我无法用对象元素来修正它,请问您可以考虑一下吗? –

+0

我已经更新了我的答案,这是您想要的行为还是您希望始终通过选择以前更改的选项来触发排序? – Keammoort