在使用angular过滤它们之后如何对结果进行排序

时间:2016-02-17 11:41:21

标签: angularjs sorting filter currency

我有一张桌子,每排都有一列金钱。该金额可以是不同的货币。现在我有两种不同的货币,例如欧元和美元。

为了按金额(从低到高或反向)对该表进行排序,我应首先以美元换算金额,然后对表格进行排序。

所以,我有一个订单功能,可以很好地参考:https://docs.angularjs.org/api/ng/filter/orderBy

我创建了一个过滤器'货币'将金额从欧元转换为美元(我将其作为默认值)。货币转换器运作良好。

但是,当我点击按钮进行订购时,我会看到带有转换货币的结果,但是表格是按照第一批结果的数值排序的。

ng-click="changeCurrencyToDollars(); order('bonus_amount');"

例如,初始数据是:

  1. 10美元
  2. 9欧元
  3. 并将其转换为:

    1. 美元
    2. 11.14美元
    3. 为什么排序不适用于转换后的货币(过滤结果)的任何想法?

      由于

      控制器:

      $scope.convertedCurrency = false; //initial table data with mixed currencies
      
      $scope.changeCurrencyToDollars = function (){
              $scope.convertedCurrency = $scope.convertedCurrency ? false: true;
          };
      
      $scope.order = function(predicate){
              $scope.predicate = predicate;
              $scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false;
              $scope.operators = orderBy($scope.operators, predicate, $scope.reverse);
          };
      
      app.filter('currency', [function() {
          var defaultCurrency = 'Dollars';
          return function(input, currencySymbol){
              var out = "";
              currencySymbol = currencySymbol || defaultCurrency;
      
              switch (currencySymbol){
                  case 'Dollars':
                      out = input;
                      break;
      
                  case 'EUR':
                      out = 1.11 * input; // convert to dollars
                      currencySymbol = defaultCurrency;
                      break;
      
                  default:
                      out = input;
              }
      
              return out.toFixed(0) + ' ' + currencySymbol;
          }
      }]);
      

      查看:     在ng-repeat里面:

      <span class="highlight-word" ng-if="!convertedCurrency">{{operators.bonus_amount}} {{operators.bonus_currency}}</span>
      <span class="highlight-word" ng-if="convertedCurrency">{{operators.bonus_amount | currency: operators.bonus_currency}}</span>
      

2 个答案:

答案 0 :(得分:0)

我是如何解决的:

我使用转换后的值为每个对象插入了一个新属性。这样每个对象都有一个“美元”属性。对于排序我使用了相同的$scope.order,因为它正在工作,但具有对象的新属性。不是最好的角度解决方案,但至少“重量”在控制器中,而不在视图中。

答案 1 :(得分:0)

你没有给出你的对象,但是,让我们这样说:

$scope.operator = [{
bonus_amount:'100',
bonus_currency:'Dollars'},
{
bonus_amount:'10',
bonus_currency:'Dollars'},
{
bonus_amount:'150',
bonus_currency:'Dollars'}];

现在让我们添加货币过滤器(您可以自定义过滤器进行转换)和orderby过滤器,并显示数据: 在您的ng-repeat中添加&#39; orderBy &#39;过滤,然后,当您显示数据时,您可以添加&#39; 货币&#39;过滤器:

<li ng-repeat="operators in operator | orderBy:'+bonus_amount'">{{operators.bonus_amount | currency }}</li>

希望有所帮助,祝你好运。