Angular.js нг-шоу и директива не работает

0

У меня есть следующий html:

<div class="modal-dialog" ng-controller="modal-ctrl" ng-show="showModal" execute-on-esc>

Приложение Angular.js:

app.controller('modal-ctrl', function($scope) {
    $scope.showModal = true;
});

app.directive('executeOnEsc', function ($document) {
    return {
        restrict: 'A',
        link: function (scope) {
            return $document.bind('keydown', function(event) {
                event.which === 27? scope.showModal = false : false;
            });
        }
    }
});

Все работает хорошо, $ scope.showModal chages - false, но ng-show не реагирует на это изменение. Зачем? Console.log показывает, что изменяется значение $ scope.showModal. Где проблема?

  • 0
    Когда вы установили значение showModal для console.log?
  • 0
    return $ document.bind ('keydown', function (event) {event.which === 27? scope.showModal = false: false; console.log (scope.showModal);}); Разные корни, верно?
Показать ещё 3 комментария
Теги:

1 ответ

1
Лучший ответ
return $document.bind('keydown', function(event) {
    event.which === 27? scope.showModal = false : 
});

Вы создаете прослушиватель событий, этот слушатель выполняется вне цикла углового дайджеста. Таким образом, вы должны сказать, что нужно начинать новый цикл дайджеста, чтобы изменения были подобраны. Вы можете использовать scope. $ Apply для этого:

return $document.bind('keydown', function(event) {
    scope.$apply(function(){
        event.which === 27? scope.showModal = false : 
    });
});

демонстрация

var app = angular.module("app", []);

app.controller('modal-ctrl', function($scope) {
  $scope.showModal = true;
});

app.directive('executeOnEsc', function($document) {
  return {
    restrict: 'A',
    link: function(scope) {
      return $document.bind('keydown', function(event) {
        scope.$apply(function() {
          event.which === 27 ? scope.showModal = false : false;
        });
      });
    }
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
  <div class="modal-dialog" ng-controller="modal-ctrl" ng-show="showModal" execute-on-esc>
    My Modal
  </div>
</div>
  • 0
    Работай как шарм, спасибо! :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню