AngularJS ngEnter - 函数被调用两次

时间:2016-02-25 12:52:47

标签: angularjs

我有指令ngEnter的输入,如果我按回车,则函数convertAdditionalHoursInHoliday被调用两次 - 只是第一次。如果我再次按Enter键,则只调用一次该函数。 有没有人知道为什么或者我可以阻止这个?

<input type="text" name="additionalHoursInHolidayAmount"   
    ng-model="institutionUserConnection.scheduleAbsenceHeader.additionalHoursInHoliday" 
    ng-Enter="vm.convertAdditionalHoursInHoliday(institutionUserConnection)"
    ng-class="institutionUserConnection.scheduleAbsenceHeader.errorTimeAdditionalHoursInHoliday ? 'form-control input errorTime' : 'form-control input'" 
    placeholder="00:00" />

该指令如下所示:

(function() {
'use strict';

angular
    .module('aposoft.userschedulemanagement')
    .directive('ngEnter', function () {
        return function (scope, element, attrs) {
            element.bind("keydown keypress", function (event) {
                if(event.which === 13) {
                    scope.$apply(function (){
                        scope.$eval(attrs.ngEnter);
                    });

                    event.preventDefault();
                }
            });
        };
    });

})();

1 个答案:

答案 0 :(得分:1)

我也有这个问题..无法理解为什么在某些函数中ng-enter按预期工作,而在其他函数中它被调用两次。

必须找到这个问题的快速解决方案,所以我找到了这个选项:

<input ng-keyup="$event.keyCode == 13 && tempFunc()"... />

在你的情况下它看起来像那样:

<input type="text" name="additionalHoursInHolidayAmount"   
    ng-model="institutionUserConnection.scheduleAbsenceHeader.additionalHoursInHoliday" 
    ng-keyup="$event.keyCode == 13 && vm.convertAdditionalHoursInHoliday(institutionUserConnection)"
    ng-class="institutionUserConnection.scheduleAbsenceHeader.errorTimeAdditionalHoursInHoliday ? 'form-control input errorTime' : 'form-control input'" 
    placeholder="00:00" />

就我而言,它就像一个魅力......你应该看看它。

如果有任何关于为什么ng-enter指令被调用两次的见解,我也希望得到通知..

希望此解决方案现在有用:)

=============================================== ==

我认为我找到了一个更好的解决方案。

在没有逗号的情况下添加keydown和keypress事件来分隔它们意味着两者都可以同时触发。这可能会产生$ rootScope:inprog错误。在它们之间添加逗号会创建一个析取,并确保只发生$ digest循环。 (发现Ryan Miller在另一篇文章中的评论 - 谢谢Ryan)

所以我们得到的工作指令是(鼓滚):

.directive('ngEnter', function () {
  return function (scope, element, attrs) {
    element.bind("keydown, keypress", function (event) {
      if(event.which === 13) {
        scope.$apply(function (){
          scope.$eval(attrs.ngEnter);
        });
        event.preventDefault();
      }
    });
  };
});

我已经在我的代码上检查了它,它就像一个魅力。

干杯。