2012-06-11 7 views

Respuesta

11

Una definición controlador en angular es en realidad una clase y no un objeto. Cada lugar en el HTML al que se hace referencia en el controlador, durante la fase de compilación, angular crea un nuevo objeto controlador usando la clase de controlador definida. Por lo tanto, podría referirse a más de un ámbito con la misma clase de controlador.

Siempre hay un alcance asociado con un controlador y todas las variables están vinculadas a ese ámbito. Se podía acceder el alcance de un elemento HTML en particular llamando algo así como

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

También sería bueno si usted nos deja saber por qué usted está intentando tener acceso el alcance desde fuera del controlador.

ACTUALIZACIÓN

Este es el componente pestaña de arranque ... Usted puede utilizar esto como

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

Ésta es la misma que existe en http://angularjs.org/ página principal .. Sólo he actualizado para transmitir eventos cuando una pestaña cambia.

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

Esto distribuye un evento cuando la ficha cambia ..

+0

Básicamente quiero usar AngularJS y arranque (pestaña JavaScript componente) al mismo tiempo. Implementé la arquitectura REST y quiero recuperar recursos cada vez que los usuarios cambian a un panel de pestañas diferente. Así que debo vincularme al evento de cambio de pestaña y llamar a la función del controlador para recuperar de este servicio web tranquilo. Además, cuando recupero del servicio web de descanso, necesito especificar una Id. De usuario. Aunque solucioné el ID de usuario al principio, pero no quiero dañar el Id en el controlador o alcance en el archivo js. – Chris

+0

Por lo tanto, debo establecer la variable (Id del usuario) en el alcance y la función del controlador de llamadas (recuperar datos del servicio web reparador) desde afuera. ¿Alguna idea de cómo se puede lograr esto? ¡Gracias! – Chris

+0

Si es posible, me gustaría evitar el uso de directivas personalizadas, ya que parece que no todos los navegadores admiten directivas personalizadas. Pero gracias por tu idea. – Chris

Cuestiones relacionadas