2014-10-22 2 views
1

Я использую angular.ui tabset. Я знаю, что он использует transclude и имеет изолированную область видимости, но я не понимаю следующего поведения:Angularjs ng-click внутри изолированного пространства вызывает функции в области видимости outter

Если я устанавливаю ng-модель внутри директивы, то угловое связывает ее с областью действия директивы. Это то, что я ожидал, но если вызов выполняется с помощью ng-click (внутри директивы), вызывается функция scope outter.

Может кто-нибудь помочь мне понять это, пожалуйста?

<html data-ng-app="test"> 
    <head> 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.js"></script> 
    <script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.11.2.js"></script> 
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet"> 
    </head> 
    <body> 

<div data-ng-controller="Ctrl"> 
Outter scope id: {{ $id }} 

    <tabset> 
    <tab heading="Tab 1"> 
     <p>Inner scope id: {{ $id }}</p> 

     <input type="text" data-ng-model="name" /> 
     <p>This model is bound on inner scope: {{ name }}</p> 

     <p> 
      <button data-ng-click="foo()">Invoke Foo</button> 
      This button is inside inner scope but invokes foo() on outter scope. 
     </p> 
    </tab> 
    </tabset> 

</div> 
</body> 
</html> 

и код JavaScript:

angular.module('test', ['ui.bootstrap']).controller('Ctrl', function ($scope) { 
    $scope.name = "Test"; 

    $scope.foo = function() { 
     alert($scope.$id + ' - ' + $scope.name); 
    } 
}); 

Спасибо.

+0

Я до сих пор не понимаю, что именно у вас проблем? Я помещаю ваш код в JSFiddle, и он работает так, как я ожидал, - когда я нажимаю кнопку, я получаю предупреждение с «002 - Test2» –

ответ

0

Это работает, потому что наследование вашего дочернего объекта из родительского поля.

см больше здесь https://github.com/angular/angular.js/wiki/Understanding-Scopes

+0

Это то, что я пропустил: «Что происходит, так это то, что область дочернего объекта получает свое собственное свойство который скрывает/затеняет родительское свойство с тем же именем. Это не то, что делает AngularJS - так работает прототипное наследование JavaScript ». Спасибо за ответ. –