繁体   English   中英

如何创建自定义指令以侦听输入更改

[英]How to create custom directive to listen to input changes

嗨,我在这里写了一个自定义指令。 该指令需要在值更改时每次调用。 这是我的指令。 我该如何调用ng-change.here是我的指令。

app.directive('percentageFormatter', function() {
      return {
        require: 'ngModel',
        link: function(scope, element, attrs, ngModelController) {
          ngModelController.$parsers.push(function(data) {
            //convert data from view format to model format
            return data.replace('%','');
          });

          ngModelController.$formatters.push(function(data) {
            //convert data from model format to view format
            return data+'%';
          });
        }
      }
    });

JSP:-

<input type="text"  percentage-formatter ng-model="tea">

在这里,如何在ng-change中调用该指令。

$scope.watch函数$scope.watch值的变化。 将此添加到您的指令

 $scope.$watch(function () {
  // do soething 
});

或者,您也可以使用以下一种用途。

   element.bind('keypress', function(event) {
      if(event.keyCode === 32) {
        event.preventDefault();
      }
    });

这就是我创建百分比格式器的方式

angular.module('test')
  .directive('percentageFormatter', function() {
    return {
      require: '?ngModel',
      link: function(scope, element, attrs, ngModelCtrl) {
        if(!ngModelCtrl) {
          return;
        }

        ngModelCtrl.$parsers.push(function(val) {
          if (angular.isUndefined(val)) {
            val = '';
          }
          var clean = val.replace("%", '');
          if (val !== clean) {
            ngModelCtrl.$setViewValue(clean);
            ngModelCtrl.$render();
          }
          return clean;
        });

        element.bind('keypress', function(event) {
          if(event.keyCode === 32) {
            event.preventDefault();
          }
        });
      }
    };
  });

我的第一个想法是使用$ watch():

app.directive('percentageFormatter', function() {
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, ngModelController) {
      scope.$watch(
        () => ngModelController.$modelValue,
        (newval) => {
          // Do your stuff here - the value has changed!
      }
    );
  }
);

直接在指令中调用change事件。试试看

app.directive('percentageFormatter', function() {
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, ngModelController) {
        element.bind('change', function () {
             ngModelController.$setViewValue(element.val());
             ngModelController.$render();
        });
    }
  }
});

我该如何调用ng-change.here是我的指令。

底层 1ng-change指令使用ngModelController。$ viewChangeListeners API percentageFormatter指令可以执行以下操作:

ngModelController.$viewChangeListeners.push(function myChange() {
     //Do things as if called by ng-change
});

仅当输入值的更改导致将新值提交给模型时,才会评估myChange函数。

不会被评估:

  • 如果$parsers转换管道返回的值未更改
  • 如果输入继续无效,因为模型将保持为null
  • 如果通过编程方式更改了模型(从控制器到用户输入)

这为指令提供了可靠的“ ng-change”功能,而无需添加其他监视程序或事件侦听器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM