【问题标题】:Hide Value in input when it's zero in angular Js当角度 Js 为零时隐藏输入中的值
【发布时间】:2014-10-23 21:28:51
【问题描述】:

我有一个角度对象 item.add_value = 0 绑定到

<input type="number" ng-model="item.add_value"   ng-change="sumUp(item)" min="0" max="10000000000" />

为了进行计算,我必须使用 type="number" 而不是 type="text"

那我的问题是当值为0时如何隐藏输入的内容?

【问题讨论】:

  • 在 JavaScript 中将字符串转换为数字很简单。至于你的第二个问题:我不认为这是一个好主意。如果它等于 0,为什么不想显示该值?

标签: angularjs


【解决方案1】:

我刚刚遇到了同样的问题,并找到了一种方法来修复/改进@dubadub 的答案,所以我分享了他的指令版本:

.directive('hideZero', function() {
    return {
        require: 'ngModel',
        restrict: 'A',
        link: function (scope, element, attrs, ngModel) {
            ngModel.$formatters.push(function (inputValue) {
                if (inputValue == 0) {
                    return '';
                }
                return inputValue;
            });
            ngModel.$parsers.push(function (inputValue) {
                if (inputValue == 0) {
                    ngModel.$setViewValue('');
                    ngModel.$render();
                }
                return inputValue;
            });
        }
    };
})

您只需在输入中添加hide-zero 属性即可使用它。

【讨论】:

  • 这是更好的解决方案,因为光标仍然存在(设置 text-indent 会丢失光标),并且您不修改实际值(我们只想更改显示,而不是底层型号)。
【解决方案2】:

最简单(也是最奇怪)的方法是使用... CSS!考虑一下:

<input type="number" ng-model="item.add_value" 
        ng-class="{zero: item.add_value === 0}"
        ng-change="sumUp(item)" 
        min="0" 
        max="10000000000" />

和 CSS:

.zero {
   text-indent: -7px;   
}

不确定它是否适合您,但如果您根据字体大小和输入填充调整缩进,这绝对很有趣并且可以工作。

演示:http://plnkr.co/edit/2gRzdY7DVwrPdNGoD0Fq?p=preview

UDP。使用指令的另一个版本:

.directive('hideZero', function() {
    return {
        link: function(scope, element) {
            element.on('input change', function() {
                if (this.value === '0') {
                    this.value = '';
                }
            })
        }
    };
});

并像这样使用它:

<input type="number" ng-model="item.add_value" 
       ng-change="sumUp(item)" 
       hide-zero
       min="0" 
       max="10000000000" />

演示:http://plnkr.co/edit/nrE3vEW2NSuLYeZuKIjO?p=preview

【讨论】:

  • 是的,这就是为什么我说这是最简单的方法。如果不是凌晨 1 点,我会尝试使用 $parsers$formatters 发出指令。这就是您应该尝试解决此问题的方法。
  • @Ricc 这是一个更简单的带有自定义指令的版本:plnkr.co/edit/nrE3vEW2NSuLYeZuKIjO?p=preview
  • 我不太确定语法,但在 中是隐藏零,但在指令中调用'hideZero'?所以指令将大写字母和自动分隔单词?
  • 是的,在 HTML 中你使用蛇形大小写,但在 javascript 中它被翻译成驼峰形。
  • 您介意为我回答这个问题吗? stackoverflow.com/questions/26552647/…
【解决方案3】:

我认为,最好的方法是使用ngModelController,因为它不使用 DOM(我们只是在数据层,不在视图中,我们需要像往常一样绑定,除了 0)并且非常严格。它有助于以我们需要的方式调整模型与其视图之间的绑定:

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
    $scope.name = 'World';
});

app.directive('hideZero', function() {
    return {
        require: 'ngModel',
         link: function(scope, element, attrs, modelCtrl) {

           modelCtrl.$parsers.push(function (inputValue) {

             if (inputValue === 0) {
               return '';
             }         

             return inputValue;         
           });
         }
    }
});

查看更多https://docs.angularjs.org/api/ng/type/ngModel.NgModelController

工作的笨蛋http://plnkr.co/edit/Zatou8lLx23xwXd1x9hd?p=preview.

【讨论】:

【解决方案4】:

您可以使用ng-showng-hide,具体取决于您想要的语义。

我会推荐ng-hide,因为在我看来它更直观和语义化:

 <input type="number"
        ng-hide="item.add_value == '0'"
        ng-model="item.add_value"
        ng-change="sumUp(item)"
        min="0" 
        max="10000000000" />

但你可以使用:

ng-show:

 <input type="number"
        ng-show="item.add_value != '0'"
        ng-model="item.add_value"
        ng-change="sumUp(item)"
        min="0" 
        max="10000000000" />

【讨论】:

  • 但是如果你做 ng-hide,它会隐藏整个输入,对吧?我只想隐藏 0 值。在添加“ng-if”后我的计算不起作用我认为这将重新创建让 item.add_value 失去其参考的对象
  • @Ricc 对,它会隐藏整个输入元素。
  • 只隐藏零值是什么意思?
  • 我认为正确的解决方案是在执行计算时捕获错误。
【解决方案5】:

var app = angular.module('app', []);

app.controller('firstCtrl', function($scope) {

  $scope.item = {
    add_value: 0
  };

  $scope.$watch('item.add_value', function() {
    if ($scope.item.add_value === 0) {
      $scope.item.add_value = "";

    }

  });
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="app">
  <div ng-controller="firstCtrl">
    <input type="number" ng-model="item.add_value" ng-change="sumUp(item)" min="0" max="10000000000" />


  </div>
</div>

【讨论】:

  • @Ricc 你可以使用$scope.$watch
【解决方案6】:

实际上最简单的解决方案是将最小值设置为 > 0,比如 10?

<input type="number" ng-model="item.add_value" ng-change="sum_Up(item)" min="10" max="10000000000" /> <br />

【讨论】:

    【解决方案7】:

    我让它是字符串,但在计算时解析它:

    <input type="number" ng-model="item.add_value"   ng-change="sumUp(item)" min="0" max="10000000000" />
    {{total}}
    

    JS:

    var getRealValue = function(val){
        if(val === ''){
            return 0;
        }else{
            return parseFloat(val);
        }
    };
    $scope.sumUp = function(val){
       $scope.total = getRealValue(val);
    };
    

    【讨论】:

      猜你喜欢
      • 2021-03-17
      • 1970-01-01
      • 2016-07-16
      • 2015-11-30
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多