2016-02-25 3 views
1

У меня есть этот вход с директивой ngEnter, и если я нажимаю кнопку ввода, то функция convertAdditionalHoursInHoliday вызывается дважды - только в первый раз. Если я снова нажимаю клавишу ввода, а функция запускается только один раз. У кого-нибудь есть идеи, почему или хао я могу это предотвратить?AngularJS ngEnter - функция вызывается дважды

<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

У меня тоже была эта проблема .. не мог понять, почему в определенных функциях 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" /> 

В моем случае это работало как очарование .. Вы должны это проверить.

Если есть понимание о том, почему нг ввести директиву вызывается дважды, я хотел бы быть информированным, а ..

Надеюсь, это решение помогает сейчас :)

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

Я думаю, что нашел лучшее решение, работающее с директивой.

Добавление обоих событий нажатия клавиш и нажатия клавиш без запятой, чтобы разграничить их, означает, что оба могут запускаться одновременно. Вероятно, это порождает ошибки $ rootScope: inprog. Добавление запятой между ними создает дизъюнктиву и обеспечивает только цикл $ digest. (нашел этот комментарий Райан Миллер в другой пост - спасибо Райан)

так, что мы получаем для рабочего директивы (барабанная дробь):

.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(); 
     } 
    }); 
    }; 
}); 

Я проверил это на мой код и он работает Как колдовство.

Cheers.

+0

Большое спасибо Vali !!! – quma

+0

Это сработало и для меня! Благодаря! –

Смежные вопросы