【问题标题】:Number filter on input输入数字过滤器
【发布时间】:2014-09-07 03:35:10
【问题描述】:

我无法让过滤器处理数字/文本输入。

<input type="number" class="text-center" ng-model="redeem.redemption.Amount | number: 2">

这会引发错误:Expression 'redeem.redemption.Amount | number' 是不可分配的 如果我删除过滤器,它可以工作。我尝试将相同的过滤器应用于角度输入演示,它工作正常(https://docs.angularjs.org/api/ng/filter/number)。我能看到的唯一区别是我绑定到范围上的一个对象,而不是直接绑定一个值。我在这里缺少什么简单的东西吗?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    我猜你想要做的是显示他们输入的“格式化值”?

    然后只需从ng-model 和控制器watch 中删除过滤器redeem.redemption.Amount 并在watch 被触发时对其进行格式化。您还需要设置timeout 以允许用户输入,否则每次用户点击数字时watch 将尝试格式化数字并且用户将无法输入任何内容。

    您发布的代码将永远无法工作,因为ng-model 与您指定的范围属性建立了 2 路数据绑定,这就是您不能在那里设置过滤器的原因,它只会接受范围的属性,它将被更新,并在它发生变化时从那里读取值。 filter 是一个有一个输入并检索不同输出的函数,想想看,如果你设置了过滤器,那么 Angularjs 将不知道它必须在哪里设置输入的变化。

    类似这样的:

    app.controller('MyCtrl', function($scope,$filter,$timeout) {
      $scope.testValue = "0.00";      
      var myTimeout;
      $scope.$watch('testValue', function (newVal, oldVal) {
          if (myTimeout) $timeout.cancel(myTimeout);    
          myTimeout = $timeout(function() {
              if($filter('number')(oldVal, 2)!=newVal)
                $scope.testValue = $filter('number')($scope.testValue, 2);
          }, 500);
      });
    });
    

    http://plnkr.co/edit/WHhWKdynw0nA4rYoy6ma?p=preview

    尝试调整超时的延迟,现在它被设置为 500 毫秒。

    【讨论】:

    • 是的,我想确保该值保持为 2 位十进制数。我知道我可以使用指令或设置手表,但我不明白为什么它会在过滤器示例中起作用,但在我的代码中却不起作用。
    • 这是有道理的......但是请参阅我在 Mukund 的回答中的评论中的示例,那为什么会起作用?
    • 这个还是不解释,不过你的解释很好,我给你答案:plnkr.co/edit/g0BH6vvTpP9nFDRDyfMx?p=preview
    • 对此的解释很简单:您是否注意到当您尝试编辑字段时,光标会移动到末尾?原因是当用户尝试进行更新时,过滤器会被执行,然后它会覆盖该字段,从而使用户无法进行任何更改。
    • 是的,但是当它尝试呈现页面时抛出错误,我什至无法打开页面。感谢您的解释
    【解决方案2】:

    你不能把过滤器放在 ng-model 指令中。你可以用这个来做控制器:

    redeem.redemption.Amount=redeem.redemption.Amount.toFixed(2);
    

    或者您可以使用 jquery 来防止在十进制数字后按下两位数字,如下所示:

    $('.decimal').keypress(function (e) {
            var character = String.fromCharCode(e.keyCode)
            var newValue = this.value + character;
            if (isNaN(newValue) || parseFloat(newValue) * 100 % 1 > 0) {
                e.preventDefault();
                return false;
            }
        });
    
    <input type="number" id="decimal" class="text-center" ng-model="redeem.redemption.Amount | number:">
    

    【讨论】:

    • 你可以,我从 Angular 文档中改变的唯一一件事就是将过滤器添加到输入的 ng-model 中,就像我在我的代码中尝试使用它的方式一样:plnkr.co/edit/g0BH6vvTpP9nFDRDyfMx?p=preview跨度>
    猜你喜欢
    • 2017-07-16
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2015-03-03
    相关资源
    最近更新 更多