AngularJS:使用element.bind('input')在自定义指令中访问事件

时间:2015-01-03 22:49:26

标签: javascript angularjs

我必须编写自定义指令,因为在编写韩文字符时我需要访问用户输入。正如another post中所述,我不能使用keydown或keypress,因为在编写韩文字符时,它们不会在正确的时间触发。 element.bind('input')可以解决问题,但现在我面临另一个问题。

如果输入键被命中,如何访问element.bind回调中的事件以退出/返回?

HTML

<input cst-input="quizzesCtrl.checkAnswer(answer)" name="answer" id="answer" ng-model="quizzesCtrl.answer" type="text" />

指令

.directive('cstInput', function() {
  return {
    restrict: 'A',
    require: '^ngModel',    
    link: function (scope, element, attrs, ngModel) {
      element.bind('input', function(event) {                  
        if (event.which === 13) { return; } // can't access the event unless I bind to keypress etc
        scope.$apply(function(){            
          scope.ngModel = element.val();
          scope.$eval(attrs.cstInput, {'answer': scope.ngModel});
        });
      });
    }
  };
})

1 个答案:

答案 0 :(得分:3)

请注意;

输入没有具有哪些属性并在按键后触发。即你可以在keypress事件中绑定unbind input 事件。输入事件也不会在Enter上触发。即e.which == 13不需要验证。

退格时不会触发 keypress 事件,如果退格时不需要检查值,则没有问题。

针对每个密钥触发

keydown keyup 事件,您可以将它们与彼此一起使用 你可以尝试这样的事情。

.directive('cstInput', function() {
  return {
   restrict: 'A',
   require: '^ngModel',    
   link: function (scope, element, attrs, ngModel) {
       element.on('keypress', function(event) {                  
              if (event.which === 13) { return; } // check key how you want
               //attach input event 
               element.on('input', function(evt) { 
                   scope.$apply(function(){            
                       scope.ngModel = element.val();
                       scope.$eval(attrs.cstInput, {'answer': scope.ngModel});
                   });
                   //deatach event again
                   element.off('input')
              });
       });

      //Alternatively using keydown with same way
      element.on('keydown', function(event) {                  
              if (event.which === 13) { return; } // check key how you want
               //attach input event 
               element.on('input', function(evt) { 
                   scope.$apply(function(){            
                       scope.ngModel = element.val();
                       scope.$eval(attrs.cstInput, {'answer': scope.ngModel});
                   });
                   //deatach event again
                   element.off('input')
              });
       });

   }
 };
})