Angularjs:动态创建的控制器加倍

时间:2015-09-16 21:09:40

标签: angularjs angularjs-controller

我正在尝试在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"

然后只创建了一个控制器,所以我假设问题是这一行创建了另一个控制器。我如何规避这一点,我是否正确地动态创建控制器?

2 个答案:

答案 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