2015-10-09 3 views
-1

У меня есть эта простая разметка:Сфера не распространяется в моей директиве AngularJS?

<div ng-app="superApp" ng-controller="myCtrl"> 
    <superhero> HOVER ME </superhero> {{a}} 
</div> 

Следующий код изменяет {{a}} в 444:

var app = angular 
     .module('superApp', []) 
     .controller('myCtrl', ['$scope', function ($scope) 
     { 
      $scope.a = 444; 
     }]) 

Результат:

HOVER ME 444 

Теперь добавьте код для директивы:

app.directive('superhero', [ 
     function() 
     { 
      return { 
       restrict: "E", 
       controller: function ($scope) 
       { 
        $scope.a = 555; 
       }, 
       link: function (scope, element, attrs) 
       { 
        element.bind("mouseenter", function() 
        { 
         scope.a = 999; 
        }); 
       } 
      } 
     } 
]); 

В результате:

HOVER ME 555 

Это означает, что одно и то же объем, как контроллер видит.

Но если я парить ярлык, то {{a}} не меняется на 999

Вопрос

Почему не {{a}} изменен 999? разве это не тот же масштаб?

Также - Batarang показывает 2 области применения как ng-app ???

enter image description here

jsbin

ответ

1

Это происходит потому, что ваш mouseover событие выходит за рамки углового. Это событие jQuery.

Есть два решения, лучше всего использовать основные директивы, такие как ng-mouseover в вашем шаблоне директив, если он использует один. Или в обработчике событий jQueries используйте $scope.$apply().

element.bind("mouseenter", function() 
{ 
    scope.$apply(function(){ 
     scope.a = 999; 
    }); 
}); 

http://jsbin.com/buzuveludu/1/edit?html,js,output

+0

Спасибо. Сколько областей здесь? Я имею в виду, почему Batarang показывает 2? –

+0

Мое понимание - это одна область, разделенная между двумя директивами, но я могу ошибаться. Я знаю, что предоставление 'scope: {}' в определении вашей директивы создает вторую изолированную область для вашей директивы. По какой-то причине ваше редактирование похоже на то, что он определяет ваше приложение целиком дважды. Никогда не слышал о «Batarang», но я бы не ожидал, что это поведение будет вызвано простой директивой, подобной той, которую вы используете. Возможно также, что директива имеет свой собственный охват, но она связана с родителями, но я не мог сказать с уверенностью. – ste2425

+1

Нет директивы 'ng-hover'. То, о чем вы думаете, это «ng-mouseover». Пожалуйста, отредактируйте этот пост –

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