我有一個子組件MyStats,它將輸入數據作爲列表並顯示關於該列表的統計信息。當myData中的列表更新時,我需要在組件內調用rebuildStats函數。由於組件中沒有$ scope,所以我不能添加$ watch。有沒有辦法從MainCtrl調用rebuildStats?什麼是解決它的最好方法?如何訪問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>
編輯:有2個解決方案,我現在使用: 1)在數據塊I改變爲2路結合和介紹了從組件內創建,然後父母可以調用此setter函數功能。它不使用$範圍,但仍...不知道這是什麼角度的創作者的意圖。
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();
};
}
});
第二種方法是通過元件訪問控制器。像這樣:
var getController = function(elementSelector, controllerName) {
var el = angular.element(document.querySelector(elementSelector));
if (el) {
return el.controller(controllerName);
}
return null;
};
所以,現在如果我有MyTestController控制器,具有標籤「我的測試控制器」和具有ID =「ID1」那麼我可以訪問它想:
var ctrl = getController('my-test-controller#id1', 'MyTestController');
ctrl.MyTestControllerMethod(); // access any exposed method
我必須在舊的ES5領域進行操作。我可以$注入,但這聽起來很駭人(因爲從組件中取出$ scope是有原因的)。我覺得很奇怪,我可以使用像'onUpdate'這樣的函數綁定從組件到父組通信:'&',但是沒有明顯的方法(如果有的話)從父組件調用。 –