【问题标题】:Prevent Angular $watch from looping防止 Angular $watch 循环
【发布时间】:2015-07-30 17:15:59
【问题描述】:

我正在整理一个快速的资金输入,它会自动将小数点添加到输入的金额中。但是我遇到了一个问题,我的 $watch 函数永远循环然后出错。这就是我所拥有的:

$scope.$watch('enteredBillAmount.number', function(newValue, oldValue) {
    if(!angular.equals(newValue, oldValue)) {
        $scope.enteredBillAmount.number = Number(newValue) / 100;
    }
});

任何建议将不胜感激。

【问题讨论】:

    标签: angularjs angularjs-scope watch angularjs-digest


    【解决方案1】:

    您的 watch 函数会更改您正在观看的项目,所以它当然会循环播放。每次函数运行时都会触发手表。

    您可以做以下两件事之一,或者为数字使用不同的变量:

    $scope.$watch('enteredBillAmount.number', function(newValue, oldValue) {
        if(!angular.equals(newValue, oldValue)) {
            $scope.enteredBillAmountNumber = Number(newValue) / 100;
        }
    });
    

    但是,考虑到这只是一个格式化功能,您还可以创建一个自定义过滤器:

    angular.filter('bill', function() {
      return function(input) {
        return input ?  Number(input) / 100 : '';
      };
    });
    

    【讨论】:

      【解决方案2】:

      Angular 有一个内置的货币过滤器,你应该考虑使用它。这也将使用系统的语言环境,非常方便。你将如何使用它是你输出的地方:

      <span id="billedAmount">{{enteredBillAmountNumber | currency}}</span>

      如果你需要在控制器中使用这个,你可以注入 $filter 然后使用:

      var myFormattedAmount =  $filter('currency')($scope.enteredBillAmountNumber);

      【讨论】:

        猜你喜欢
        • 2016-11-05
        • 2018-03-15
        • 1970-01-01
        • 2016-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-08
        相关资源
        最近更新 更多