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

Angularjs: Dynamically created controllers are doubled

我正在尝试在 masterController 中动态创建子控制器。我从 this page. Please see this 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

这里很明显生成了两个子控制器,而不是一个。如果我删除 html-第 16 行

ng-controller="childController"

然后只创建了一个控制器,所以我认为问题是这一行创建了另一个控制器。我该如何避免这种情况,我是否正确地动态创建了控制器?

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;
};

您关于 ng-controller 正在创建另一个控制器的假设是正确的。要绕过它,您可以将控制器构造函数传递给它,而不是自己实例化它。

工作fiddle:https://jsfiddle.net/acw9q0ya/

createNewChildController中:

    var ControllerFn = function() {
        return $controller('childController', { $scope: $scope.$new() }).constructor;
    };
    $scope.childControllers.push(ControllerFn)

最后在 ng-repeat 中,传递的名称需要与传递给 $controller 的名称相匹配。

<div ...
  ng-repeat="childController in childControllers" 
  ng-controller="childController"
  ...
>