Ich habe untergeordnete Komponente MyStats, die als Eingangsdaten mit Liste und zeigt Statistiken über diese Liste. Ich muss die Funktion rebuildStats in meiner Komponente aufrufen, wenn die Liste in myData aktualisiert wird. Da es keinen $ scope in Komponenten gibt, kann ich $ watch nicht hinzufügen. Gibt es Möglichkeit, rebuildStats von MainCtrl aufzurufen? Was ist der beste Weg, um es zu lösen?Zugriff auf Komponentenmethoden vom übergeordneten Controller in Angular1.5
module.controller('MainCtrl', ['$scope', '$http', function ($scope, $http) {
$scope.statData = {};
$http.get('..some url..').then(function(resp) {
$scope.statData.list = resp.list;
});
}]);
module.component('myStats', {
'templateUrl': '...',
'bindings': {
'myData': '<ngModel'
},
'controller': function() {
this.totalActive = 0;
this.rebuildStats = function() {
var cntr = 0;
angular.forEach(this.myData.list, function (item) {
if (item.isActive) {
cntr++;
}
});
this.totalActive = cntr;
};
}
});
<my-stats ng-model="statData"></my-stats>
Edit: Es gibt 2 Lösungen, die ich jetzt verwenden: 1) in dem Datenblock I zu 2-fach verändert Bindung und eingeführt setter Funktion, die von innerhalb Komponente erstellt wird, und dann kann Mutter nennt dies Funktion. Es verwendet $ scope aber immer noch nicht ... nicht sicher, ob das was angulare Schöpfer beabsichtigten.
module.controller('MainCtrl', ['$scope', '$http', function ($scope, $http) {
$scope.statData = {};
$http.get('..some url..').then(function(resp) {
$scope.statData.setList(resp.list);
});
}]);
module.component('myStats', {
'templateUrl': '...',
'bindings': {
'myData': '=ngModel'
},
'controller': function() {
var ctrl = this;
this.totalActive = 0;
this.rebuildStats = function() {
var cntr = 0;
angular.forEach(ctrl.myData.list, function (item) {
if (item.isActive) {
cntr++;
}
});
ctrl.totalActive = cntr;
};
this.myData.setList = function (list) {
ctrl.myData.list = list;
ctrl.rebuildStats();
};
}
});
Der zweite Ansatz besteht darin, über Element auf den Controller zuzugreifen. Wie so:
var getController = function(elementSelector, controllerName) {
var el = angular.element(document.querySelector(elementSelector));
if (el) {
return el.controller(controllerName);
}
return null;
};
So, jetzt, wenn ich Controller mit MyTestController dem Stichwort "my-Test-Controller" und hat id = "id1" dann kann ich es gerne zugreifen:
var ctrl = getController('my-test-controller#id1', 'MyTestController');
ctrl.MyTestControllerMethod(); // access any exposed method
Ich muss in alten ES5-Bereich arbeiten. Ich kann $ injizieren, aber das klingt hackisch (es gibt einen Grund, warum $ aus der Komponente herausgenommen wird).Ich finde es sehr merkwürdig, dass ich von Komponente zu Eltern kommunizieren kann, indem ich Funktionsbindung wie "onUpdate": '&' benutze, aber es gibt keinen offensichtlichen Weg (von einem Elternteil zu einer Komponente). –