从属性指令附加和处理ng-change

时间:2016-08-10 15:21:45

标签: angularjs angularjs-directive angularjs-ng-change

我们有" myCustomHandler" 属性指令

<input type="text" my-custom-handler ng-model="myModel">

该指令的简化版本如下所示:

.directive('myCustomHandler', function () {
return {
    require: 'ngModel',
    link: function (scope, elem, attrs) {
            scope.change = function(){
            console.log('model changed');            
        }
    }
}});

我需要一种方法来处理指令中的ng-change事件(触发scope.change()函数)。

我特别要求 ng-change 的原因是我的输入是type = text,我需要处理每个键。此外,在处理更改时,我也需要旧值和新值(所以我更喜欢避免使用jQuery方法)。

我已经考虑过将$ watch用于模型,但它不会这样做,因为我只有在用户更改模型时才需要处理事件。

谢谢!

2 个答案:

答案 0 :(得分:0)

我希望这可以帮到你

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

app.controller('MainCtrl', function($scope) {
  $scope.model = { name: 'World' };
  $scope.name = "Felipe";
  $scope.$watch('name',function(o,n){
    console.log(o)
  })
});

app.directive('myDirective', function($compile) {
  return {
    restrict: 'E',
    scope: {
      myDirectiveVar: '=',
     //bindAttr: '='
    },
    template: '<div class="some">' +
      '<input ng-model="myDirectiveVar"></div>',
    replace: true,
    //require: 'ngModel',
    link: function($scope, elem, attr, ctrl) {
      console.debug($scope);
      //var textField = $('input', elem).attr('ng-model', 'myDirectiveVar');
      // $compile(textField)($scope.$parent);
    }
  };
});
&#13;
<!doctype html>
<html ng-app="plunker" >
<head>
  <meta charset="utf-8">
  <title>AngularJS Plunker</title>
  <link rel="stylesheet" href="style.css">
  <script>document.write("<base href=\"" + document.location + "\" />");</script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js"></script>
  <script src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
  <my-directive my-directive-var="name"></my-directive>{{name}}
</body>
</html>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

From jquery doc:

  

对于选择框,复选框和单选按钮,会触发该事件   当用户使用鼠标进行选择时,立即进行   事件的其他元素类型延迟到元素丢失   对焦。

这意味着当你点击输入时会触发onChange事件。

function listener() {
  return {
   link: function(scope, elem, attrs) {
     elem.bind("change", function() {
       alert('change');
     });
   }
  }
}

angular.module('myApp', []);
angular
  .module('myApp')
  .directive('listener', listener);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>
<div ng-app="myApp">
    <input type="text" listener>
</div>