【发布时间】:2017-01-25 18:16:09
【问题描述】:
我有子组件 MyStats,它以列表作为输入数据并显示有关该列表的统计信息。当 myData 中的列表更新时,我需要在我的组件中调用 rebuildStats 函数。由于组件中没有 $scope,我无法添加 $watch。有没有办法从 MainCtrl 调用rebuildStats?最好的解决方法是什么?
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>
编辑:我现在使用两种解决方案: 1)在数据块中,我更改为 2-way binding 并引入了从组件内部创建的 setter 函数,然后父级可以调用此函数。它不使用 $scope 但仍然......不确定这是否是 Angular 创建者的意图。
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;
};
所以现在如果我有带有标签“my-test-controller”并且 id="id1" 的带有 MyTestController 的控制器,那么我可以像这样访问它:
var ctrl = getController('my-test-controller#id1', 'MyTestController');
ctrl.MyTestControllerMethod(); // access any exposed method
【问题讨论】:
标签: angularjs components