2016-06-14 97 views
1

因此,这里是我的问题,我有一些函数/变量在父控制器编程方式创建一个控制器的新实例

function parentController($scope) { 

    $scope.numberOfChildren = $scope.numberOfChildren + 1 || 1; 
    console.log($scope.numberOfChildren); 

    $scope.someFunction = function(argument) { 
     // do stuff 
     $scope.someVariable = result of the function 
    } 
} 

我打电话这个控制器是指令控制器和其他两个控制器被称为在同一视图

function firstChildController ($scope, $controller) { 

    var aVariable = 1; 
    $scope.otherVariable = 10; 

    $controller('parentController', {$scope: $scope}); 

    $scope.someFunction(aVariable); 
} 

function secondChildController ($scope, $controller) { 

    var aVariable = 6; 
    $scope.otherVariable = 11; 

    $controller('parentController', {$scope: $scope}); 

    $scope.someFunction(aVariable); 
} 

我想要什么,是不是可以共享父范围的两个孩子。 现在,只有一个父控制器的实例,所以当我根据它在同一个视图上调用两个指令时,我得到$ scope.numberOfChildren === 2. 我想要的是这个父控制器是加载两次,但有分开的范围($ scope.numberOfChildren === 1在每个子控制器)

我设法做到这一点在视图模板中使用ng控制器和删除$控制器调用,但我想以编程方式。 (我不想每次调用指令时都要写相同的ng-controller代码)。

<div ng-controller="parentController"> 
    <first-directive></first-directive> 
</div> 
<div ng-controller="parentController"> 
    <second-directive></second-directive> 
</div> 

最后,以保持同质化项目的代码,我宁可不使用这个和VM的东西,如果有可能做的工作。

回答

1

parentController确实有它自己的范围内,它的$scope你传递给它,当你实例化这种方式$controller('parentController', {$scope: $scope})工作。

结帐这个简单的演示fiddle

您的情况中的问题可能是由共享相同范围的指令引起的,因此将相同的作用域传递给父控制器。

+0

非常感谢你的回答亚历克。事实上,指令分享范围从他们被称为英寸 我只需要附加他们一个孤立的范围(范围:{}),问题解决了。 –

+0

@AloïsdeLaComble,我很高兴它有帮助。 –

0

您期望的结果与系统运行方式完全相同:范围不在两个控制器之间共享。

当您在html中使用ng控制器时,将创建一个新的作用域(控制器实例)。从上面的代码中,将创建两个控制器实例。 您可以通过将{{$ id}}添加到html并查看范围实例的ID来查看它。

<div ng-controller="parentController"> 
    {{$id}} 
    <first-directive></first-directive> 
</div> 
<div ng-controller="parentController"> 
    {{$id}} 
    <second-directive></second-directive> 
</div> 

如果你看到{{numberOfChildren == 2}}意味着你的代码是错误的地方,而不是通过共享范围的问题。

相关问题