Si su HTML es el siguiente, puede hacer algo como esto:
<div ng-controller="ParentCtrl">
<div ng-controller="ChildCtrl">
</div>
</div>
Luego puede acceder al ámbito principal de la siguiente manera
function ParentCtrl($scope) {
$scope.cities = ["NY", "Amsterdam", "Barcelona"];
}
function ChildCtrl($scope) {
$scope.parentcities = $scope.$parent.cities;
}
Si desea acceder a un controlador principal desde su vista, debe hacer algo como esto:
<div ng-controller="xyzController as vm">
{{$parent.property}}
</div>
Ver jsFiddle: http://jsfiddle.net/2r728/
Actualizar
En realidad, desde que definió cities
en el controlador principal, su controlador secundario heredará todas las variables de alcance. Teóricamente no tienes que llamar $parent
. El ejemplo anterior también se puede escribir de la siguiente manera:
function ParentCtrl($scope) {
$scope.cities = ["NY","Amsterdam","Barcelona"];
}
function ChildCtrl($scope) {
$scope.parentCities = $scope.cities;
}
Los documentos de AngularJS utilizan este enfoque, aquí puede leer más sobre el $scope
.
Otra actualización
Creo que esta es una mejor respuesta al póster original.
HTML
<div ng-app ng-controller="ParentCtrl as pc">
<div ng-controller="ChildCtrl as cc">
<pre>{{cc.parentCities | json}}</pre>
<pre>{{pc.cities | json}}</pre>
</div>
</div>
JS
function ParentCtrl() {
var vm = this;
vm.cities = ["NY", "Amsterdam", "Barcelona"];
}
function ChildCtrl() {
var vm = this;
ParentCtrl.apply(vm, arguments); // Inherit parent control
vm.parentCities = vm.cities;
}
Si utiliza el controller as
método, también puede acceder al ámbito principal de la siguiente manera
function ChildCtrl($scope) {
var vm = this;
vm.parentCities = $scope.pc.cities; // note pc is a reference to the "ParentCtrl as pc"
}
Como puede ver, hay muchas formas diferentes de acceder $scopes
.
function ParentCtrl() {
var vm = this;
vm.cities = ["NY", "Amsterdam", "Barcelona"];
}
function ChildCtrl($scope) {
var vm = this;
ParentCtrl.apply(vm, arguments);
vm.parentCitiesByScope = $scope.pc.cities;
vm.parentCities = vm.cities;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.20/angular.min.js"></script>
<div ng-app ng-controller="ParentCtrl as pc">
<div ng-controller="ChildCtrl as cc">
<pre>{{cc.parentCities | json}}</pre>
<pre>{{cc.parentCitiesByScope | json }}</pre>
<pre>{{pc.cities | json}}</pre>
</div>
</div>
angular.module('app').controller('ParentCtrl', ParentCtrl);
JavaScript
ver: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Acabo de comprobar
funciona para mi.
y será
para la vista
fuente
Cuando usa la
as
sintaxis, comoParentController as parentCtrl
, para definir un controlador, para acceder a la variable de alcance principal en el controlador secundario, use lo siguiente:Donde
parentCtrl
es el nombre del controlador principal que usa laas
sintaxis yid
es una variable definida en el mismo controlador.fuente
Algunas veces es posible que deba actualizar las propiedades principales directamente dentro del ámbito secundario. por ejemplo, necesita guardar una fecha y hora de control primario después de los cambios realizados por un controlador secundario. por ejemplo, código en JSFiddle
HTML
JS
fuente
También puede eludir la herencia del alcance y almacenar cosas en el alcance "global".
Si tiene un controlador principal en su aplicación que envuelve todos los demás controladores, puede instalar un "enlace" en el ámbito global:
Luego, en cualquier controlador secundario, puede acceder al ámbito "global" con
$scope.root
. Todo lo que establezca aquí será visible globalmente.Ejemplo:
fuente
Creo que tuve un dilema similar recientemente
Mi configuración fue un poco diferente, pero lo mismo probablemente debería funcionar
fuente
Desde un componente secundario puede acceder a las propiedades y métodos del componente primario con 'require'. Aquí hay un ejemplo:
Padre:
Niño:
fuente
Súper fácil y funciona, pero no estoy seguro de por qué ...
fuente
Tal vez esto sea poco convincente, pero también puede señalarlos a ambos en algún objeto externo:
El beneficio aquí es que las ediciones en ChildCtrl ahora se propagan de nuevo a los datos en el padre.
fuente