2012-06-11 10 views

Odpowiedz

11

Definicja kontroler w kątowa jest rzeczywiście klasa, a nie obiektu. Każde miejsce w kodzie HTML, do którego odwołuje się kontroler, podczas fazy kompilacji tworzy nowy obiekt kontrolera za pomocą zdefiniowanej klasy kontrolera. Więc możesz odnosić się do więcej niż jednego zakresu z tą samą klasą kontrolera.

Z kontrolerem zawsze związany jest zakres, a wszystkie zmienne są powiązane z tym zakresem. Można uzyskać dostęp do zakresu określonego elementu html poprzez wywołanie coś podobnego

var scope = angular.element("#myelement").scope(); 
//use the scope.... 

Byłoby również dobrze, jeśli pozwolisz nam znać, dlaczego próbujesz uzyskać dostęp do zakresu od zewnątrz sterownika.

UPDATE

to bootstrap komponent tab ... Można to wykorzystać jako

<tab> 
<pane title="tab1"><pane> 
<pane title="tab2"></pane> 
</tabs> 

jest to ten sam, który istnieje w http://angularjs.org/ stronie głównej .. I to właśnie zaktualizowane do rozsyłania zdarzeń po zmianie karty.

var directives = angular.module('myApp.directives', []); 
directives.directive('tabs', function() { 
    return { 
     restrict:'E', 
     transclude:true, 
     scope:{}, 
     controller:function ($scope, $element, $rootScope) { 
      var panes = $scope.panes = []; 

      $scope.select = function (pane) { 
       angular.forEach(panes, function (pane) { 
        pane.selected = false; 
       }); 
       pane.selected = true; 
       $rootScope.$broadcast("tabChanged", pane.title); 
      } 

      this.addPane = function (pane) { 
       if (panes.length == 0) $scope.select(pane); 
       panes.push(pane); 
      } 
     }, 
     template:'<div class="tabbable">' + 
      '<ul class="nav nav-tabs">' + 
      '<li ng-repeat="pane in panes" ng-class="{active:pane.selected}">' + 
      '<a href="" ng-click="select(pane)">{{pane.title}}</a>' + 
      '</li>' + 
      '</ul>' + 
      '<div class="tab-content" ng-transclude></div>' + 
      '</div>', 
     replace:true 
    }; 
}); 
directives.directive('pane', function() { 
    return { 
     require:'^tabs', 
     restrict:'E', 
     transclude:true, 
     scope:{ title:'bind' }, 
     link:function (scope, element, attrs, tabsCtrl) { 
      tabsCtrl.addPane(scope); 
     }, 
     template:'<div class="tab-pane" ng-class="{active: selected}" ng-transclude>' + 
      '</div>', 
     replace:true 
    }; 
}); 

To wywołuje zdarzenie, gdy zmienia się zakładka ..

+0

Zasadniczo chcę użyć angularjs i bootstrap (karta JavaScript component) w tym samym czasie. Zaimplementowałem architekturę REST i chcę pobierać zasoby za każdym razem, gdy użytkownicy przełączają się do innego okienka karty. Muszę więc powiązać się ze zdarzeniem zmiany tabulacji i zadzwonić do funkcji kontrolera, aby pobrać z tej spokojnej usługi internetowej. Również podczas pobierania z restful usługi internetowej, muszę podać ID użytkownika. Chociaż naprawiłem ID użytkownika na początku, ale nie chcę hardcore ID w kontroler lub zakres w pliku js. – Chris

+0

Muszę więc ustawić zmienną (identyfikator użytkownika) w zakresie i funkcji kontrolera wywołania (pobrać dane z restful web service) z zewnątrz. Masz pomysł, jak to osiągnąć? Dzięki! – Chris

+0

Jeśli to możliwe, chciałbym uniknąć stosowania dyrektywy niestandardowej, ponieważ wydaje się, że nie wszystkie przeglądarki obsługują dyrektywę niestandardową. Ale dzięki za twój pomysł. – Chris