【问题标题】:AngularJs: How to add a custom filter inside an ngRepeat to manipulate decimals?AngularJs:如何在 ngRepeat 中添加自定义过滤器来操作小数?
【发布时间】:2016-02-22 16:47:37
【问题描述】:

我有一个包含多个属性名称和值的对象,这些属性名称和值通过 ng-repeat 打印出来。这个大对象中的两个对象称为currencyName 和currencyPrice。

默认情况下,这些对象在后端硬编码了 8 个小数,我的任务是使用 Angular 在显示页面中操作某些 currencyName 以显示 5 个小数或 8 个小数。默认情况下,currencyPrices 在后端硬编码了 8 位小数,由于该位代码在其他地方被重用,因此无法触及。对于我正在处理的显示页面,我们使用过滤器 |编号:默认为 2。

我尝试创建一个自定义过滤器,该过滤器将针对主对象的数组,运行 for 循环/forEach 方法,以currencyName 对象为目标,如果它与包含要操作的currencyNames 的数组匹配,则角度显示页面将显示 5 位小数(在这种情况下)。

这对我来说非常困难。我没有完整的代码来粘贴它,但这里有一些示例代码来显示代码的外观。

<tr ng-repeat="full in fulls.mainList" class="animate-repeat">
  <td>{{full.currencyName}}</td>
  <td>{{full.tradedAverage | number:2}}</td>
  <td>{{full.tradedAmount | number:2}}</td>
  <td>{{full.currencyPrice | number:2}}</td>
</tr>

在这种情况下,fulls 是控制器内部正在解析的大对象。

【问题讨论】:

  • 1) 你的 HTML 中的 是什么? - 这是错的。 2) 能不能把过滤器的js代码也给一下?
  • 使用真正的 MVVM 框架而不是 Angular……。
  • @shershen 嘿,对不起,我删除了它。除了 标记之外,还有其他几个标记有助于 css 和其他位。我去掉了所有的胡言乱语,让它看起来尽可能干净。值得注意的是,我能够应用 scotch.io 从scotch.io/tutorials/building-custom-angularjs-filters 列出的自定义过滤器,因此我确保常规过滤器有效,但不是我正在尝试构建的过滤器。
  • @Mjaaay,所以,你想限制currencyName吗?
  • @AbhilashPA-Pullelil 嘿,我不确定限制意味着什么。假设对象 currencyName 具有名为 CNY、USD 等的属性名称,我创建了一个包含 ["GBP", "NOK"] 的数组。如果 currencyName 与此数组中的任何内容匹配,则该 currencyName 的 currencyPrice 将通过自定义过滤器将其小数从 2 更改为 5。

标签: javascript angularjs angularjs-ng-repeat angular-filters


【解决方案1】:

测试了您的代码,它应该可以工作:

   <div ng-repeat="full in fulls.mainList">
       <span>{{full.currencyName}}</span>
       <span>{{full.tradedAverage | number:2}}</span>
       <span>{{full.tradedAmount | number:2}}</span>
       <span>{{full.currencyPrice | number:2}}</span>
   </div>

    $scope.fulls = {
          mainList : [
            {
              currencyName: 'TEST',
              tradedAverage: '12.123434',
              tradedAmount: '13.133434',
              currencyPrice: '14.143434'
            }
          ]
       };

http://jsfiddle.net/Lvc0u55v/1/

也许你有 ',' 而不是 '.'在你的数字中?

【讨论】:

  • 嘿,按预期工作。但是,我的问题是,如果 currencyName: HKD,我希望 currencyPrice 变为 |数量:5。因此,我需要创建一个包含货币名称列表(例如 HKD)的数组,以输出不同的小数。现在和你发的一样,默认显示2位小数
  • 这样的?也许您添加了一个附加属性,例如 'decimalLength' 并在匹配时返回它。 jsfiddle.net/Lvc0u55v/2
  • 我喜欢你的解决方案。我只是在实现它时遇到了麻烦,因为我们的代码库非常杂乱无章,我正在尝试跟踪文件。现在,当我通过 | console.log 传递currencyName 时,我变得不确定。 number:getIndividualFormat(full.currencyName),可能是范围问题。问题是,mainList 实际上来自一个数组,并且来自一个值为 $rootScope.orderBook 的变量,并且由于这些是在一个复杂的函数中定义的,因此尝试跟踪它们会扼杀我的大脑。一旦我把它整理好,我会批准你的答案!
  • 我检查了这个作为答案,尽管最后我被告知要创建一个自定义过滤器,以便它可以在其他地方重复使用。我最终在过滤器中声明了几个数组,并使用 .indexOf 和 parseFloat 添加了一些 if 语句以将它们返回为像 {{ full.price | decimalFilter:baseCurrency}}
【解决方案2】:

请注意,在控制器中编写自己的函数非常容易,该函数封装了小数位数的逻辑。

<tr ng-repeat="full in fulls.mainList" class="animate-repeat">
  <td>{{full.currencyName}}</td>
  <td>{{full.tradedAverage | number: (fnThatTellsTheNumberOfDecimals(full, 'tradedAverage')}}</td>
  <td>{{full.tradedAmount | number:(fnThatTellsTheNumberOfDecimals(full, 'tradedAmount')}}</td>
  <td>{{full.currencyPrice | number:(fnThatTellsTheNumberOfDecimals(full, 'currencyPrice')}}</td>
</tr>

然后在您的控制器中,编写如下内容:

$scope.fnThatTellsTheNumberOfDecimals = function(element, attr){
    if (attr === 'example' && element.type === 'some'){ return 2; }
    return 6;
};

【讨论】:

  • 这看起来是一个有趣的方法。您如何在 {{ }} 中运行 fnThatTellsTheNumberOfDecimals?一些谷歌搜索并没有给我带来太多结果......现在 console.log 显示什么元素和属性未定义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多