我有一个子组件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'这样的函数绑定从组件到父组通信:'&',但是没有明显的方法(如果有的话)从父组件调用。 –