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