我正在尝试在masterController中动态创建childControllers。我从this page得到了这个想法。请查看此JSFiddle并观看控制台。
+创建一个新的childController。每个childController都有一个随机数,在其控制器函数中创建,以及由ng-init设置的数字。
当我执行以下操作时:
click the +
click Emit
click BroadCast
控制台输出是:
new masterController
creating new childController..
new childController (undefined : 37818)
created the new childController
new childController (undefined : 49443)
child (0 : 49443) emitting..
masterController heard (0:49443)
broadcasting..
(undefined : 37818) received the broadcast
(0 : 49443) received the broadcast
done broadcasting
很明显,生成了两个childControllers,而不是一个。如果我删除html-line 16
ng-controller="childController"
然后只创建了一个控制器,所以我假设问题是这一行创建了另一个控制器。我如何规避这一点,我是否正确地动态创建控制器?
答案 0 :(得分:1)
ng-repeat创建控制器本身。您无需创建控制器。用以下代码替换您的代码:
$scope.createNewChildController = function(){
console.log("\ncreating new childController..")
//var Controller = $controller('childController', { $scope: $scope.$new() });
$scope.childControllers.push({})
console.log("created the new childController")
}
如果你想使用你想要的动态控制器,请记住你必须为数组中的每个项目都有一个变量:
$scope.SubController_1 = function() {
return $controller('ControllerName', { $scope: $scope.$new() }).constructor;
};
答案 1 :(得分:1)
你认为ng-controller正在创建另一个控制器是正确的。要绕过这个,您可以将控制器构造函数传递给它,而不是自己实例化它。
工作小提琴:https://jsfiddle.net/acw9q0ya/
在sum(case when Frequency = 'Monthly' then ISNULL(Amount,0.0) else 0 end)
:
createNewChildController
最后在ng-repeat中,传递的名称需要与传递给 var ControllerFn = function() {
return $controller('childController', { $scope: $scope.$new() }).constructor;
};
$scope.childControllers.push(ControllerFn)
的名称相匹配。
$controller