2012-08-17 10 views
33

Aquí está mi código:¿puedo heredar las variables de un controlador principal?

function ParentCtrl($scope) { 
$scope.people = ["Tom", "Dick", "Harry"]; 
$scope.count = $scope.people.length; 
} 

function ChildCtrl($scope) { 
$scope.parentpeople = ParentCtrl.people //this is what I would like to do ideally 
} 

estoy anidación uno controller angular dentro de otro. Me gustaría pasar variables del primer controller al segundo. ¿Alguien sabe como hacer esto?

NOTA

no puedo hacer algo como

ChildCtrl.prototype = new ParentCtrl(); 

porque voy a sobrescribir la propiedad people del ChildCtrl.

+0

@ pkozlowski.opensource ¿Alguna idea? – dopatraman

+0

Use $ scope.people en el controlador secundario también; las propiedades del elemento principal se heredan. –

Respuesta

46

De forma predeterminada, los ámbitos secundarios heredan prototípicamente del ámbito principal (consulte Scope), por lo que ya tiene acceso a las propiedades $ scope del controlador principal en el elemento secundario. Para probarlo:

function ChildCtrl($scope) { 
    alert($scope.people) 
} 
9

La herencia de $ scope se basa en dónde hace referencia a sus controladores utilizando ng-controller.

Si usted tiene algo así como

<div ng-controller="ParentController"> 
    <div ng-controller="ChildController"> 
    </div> 
</div> 

Entonces sí, el controlador secundario heredará las propiedades del controlador de matriz.

Nota: El controlador hijo no necesita definirse en el elemento secundario directo en el html. Puede ser cualquier niño dentro.

+2

Puedo usar propiedades del 'Parent' en el marcado HTML' Child's', pero no en el código para 'ChildController'. ¿Sabes cómo usar la propiedad '' Parent's' 'people' en la función' Child'? – dopatraman

+0

@codeninja Sería bueno si pudiera dar un requerimiento más detallado. ¿Qué estás tratando de lograr y qué/dónde estás obteniendo el problema? – ganaraj

+0

Quiero poder usar las propiedades de 'ParentCtrl' en 'ChildCtrl'. No sé cómo ser más descriptivo ... – dopatraman

25

Te estás equivocando. Está mezclando la herencia del controlador con la herencia del alcance, y son diferentes y están acoplados libremente en AngularJS.

lo que realmente quiere es:

function ParentCtrl($scope) { 
    $scope.people = ["Tom", "Dick", "Harry"]; 
    $scope.count = $scope.people.length; 
} 

function ChildCtrl($scope) { 
    $scope.parentpeople = $scope.$parent.people; 
} 

Y va a trabajar para el caso:

<div ng-controller="ParentCtrl"> 
    <div ng-controller="ChildCtrl"> 
    </div> 
</div> 

Pero como Mark y Ganaraj notado anteriormente, esto no tiene sentido, ya que puede acceder a su propiedad de $ scope.people desde ParentCtrl y ChildCtrl.

Si desea heredar los controladores entre sí, debe usar la herencia prototipo de las funciones del controlador.

+1

No hay una forma fácil de heredar controladores en AngularJS. – kstep

+1

De acuerdo con tus pensamientos kstep. Estaba tan confundido como codeninja con respecto a esto, así que escribí un artículo al respecto, la gente puede encontrarlo útil http://www.michaeldausmann.com/2013/01/angularjs-scope-vs-controller.html –

+0

@kstep Gracias mucho ! He pasado todo un día luchando para resolver este problema y finalmente encontré tu respuesta – Anas

4

También usted puede conseguir el alcance de cualquier controlador de DOM:

$needleScope = angular.element(aDomElement).scope() 

Usando jQuery:

$needleScope = $('#aDomElementId').scope() 

O obtener toda Ámbito en el documento:

$allScopes = $('.ng-scope').scope() 
0

Se podría ¡¡¡ayudarte!!!

El alcance es un objeto especial de JavaScript que conecta el controlador con las vistas.El alcance contiene datos del modelo. En los controladores, se accede a los datos del modelo a través del objeto $ scope.

<script> 
     var mainApp = angular.module("mainApp", []); 

     mainApp.controller("shapeController", function($scope) { 
     $scope.message = "In shape controller"; 
     $scope.type = "Shape"; 
     }); 
</script> 

Alcance Inheritance Alcance es específica del controlador. Si definimos controladores anidados, el controlador secundario hereda el alcance de su controlador principal.

<script> 
     var mainApp = angular.module("mainApp", []); 

     mainApp.controller("shapeController", function($scope) { 
     $scope.message = "In shape controller"; 
     $scope.type = "Shape"; 
     }); 

     mainApp.controller("circleController", function($scope) { 
     $scope.message = "In circle controller"; 
     }); 
</script> 

Ejemplo en vivo como se detalla a continuación.

<html> 
    <head> 
     <title>Angular JS Forms</title> 
    </head> 
    <body> 
     <h2>AngularJS Sample Application</h2> 
     <div ng-app="mainApp" ng-controller="shapeController"> 
      <p>{{message}} <br/> {{type}} </p> 
      <div ng-controller="circleController"> 
      <p>{{message}} <br/> {{type}} </p> 
      </div> 
      <div ng-controller="squareController"> 
      <p>{{message}} <br/> {{type}} </p> 
      </div> 
     </div> 
     <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js"></script> 
     <script> 
      var mainApp = angular.module("mainApp", []); 

      mainApp.controller("shapeController", function($scope) { 
      $scope.message = "In shape controller"; 
      $scope.type = "Shape"; 
      }); 

      mainApp.controller("circleController", function($scope) { 
      $scope.message = "In circle controller"; 
      }); 

      mainApp.controller("squareController", function($scope) { 
      $scope.message = "In square controller"; 
      $scope.type = "Square"; 
      }); 

     </script> 
    </body> 
    </html> 
+0

Posible fuente original: [AngularJS - Aplicaciones] (http://www.hackersit.com/angularjs-scopes/). –

+0

Posible fuente original: [Angular JS HTML mejorado para la web] (http://slides.com/arunjames/angular-js#/11). –

+0

Posible fuente original: [Learn AngularJS] (http://www.tutorialspoint.com/angularjs/angularjs_tutorial.pdf). –

Cuestiones relacionadas