我创建了第二个答案, 也是为了关注这个 plunker 中的问题,@skip (OP) 将它作为问题的示例传递给我。
plunker,它满足了我们的需求。主要变化如下:
原statedef:
.state('home', {
url: '/',
views: {
'': { templateUrl: 'home.html' },
'A@home': {
templateUrl: 'a.html',
controller: 'MainCtrl'
},
'B@home': {
templateUrl: 'b.html',
controller: 'MainCtrl'
}
}
已替换为 RootCtrl 定义:
.state('home', {
url: '/',
views: {
'': {
templateUrl: 'home.html',
controller: 'RootCtrl' // here we do use parent scoping
},
'A@home': {
templateUrl: 'a.html',
controller: 'MainCtrl'
},
'B@home': {
templateUrl: 'b.html',
controller: 'MainCtrl'
}
}
这是一个控制器:
app.controller('MainCtrl', function($scope) {
var fruits = [{"name": "Apple"}, {"name": "Banana"}, {"name": "Carrot"}];
$scope.bar = $scope.bar || [];
$scope.foo = 2;
$scope.$watch('foo',function(value, oldValue){
$scope.bar = [];
getBar(fruits, value);
});
function getBar(fruits, howManyFruits) {
for(var i=0; i < $scope.foo; i++) {
$scope.bar.push(fruits[i]);
}
}
});
但现在我们确实有两个(父母和孩子):
app.controller('RootCtrl', function($scope) {
$scope.bar = [];
})
app.controller('MainCtrl', function($scope) {
var fruits = [{"name": "Apple"}, {"name": "Banana"}, {"name": "Carrot"}];
//$scope.bar = $scope.bar || [];
$scope.foo = 2;
$scope.$watch('foo',function(value, oldValue){
$scope.bar.length = 0;
getBar(fruits, value);
});
function getBar(fruits, howManyFruits) {
for(var i=0; i < $scope.foo; i++) {
$scope.bar.push(fruits[i]);
}
}
});
需要提及的一些重要部分
我。最小公分母
我们必须将共享集合(数组栏)移动到父集合中。为什么?
我们必须将共享引用移动到最小公分母 - 到父范围
见
二。对数组的引用必须保持不变
我们必须保持对父 $scope.bar 的引用不变!。这是必不可少的。如何做到这一点?见:
我们没有创建新的引用,而是清除数组,保留对它的引用
// wrong
$scope.bar = [];
// good
$scope.bar.length = 0;
三。控制器可以有多个实例
另外,两个视图 A 和 B 具有相同的控制器 (实际上是相同的控制器名称),这绝对不意味着,他们是同一个实例。
不,它们是两个不同的实例……不共享任何东西。我猜,这是最关键的困惑。见
控制器的特殊之处在于,与服务不同,应用程序中可以有它们的许多实例。例如,模板中的每个 ng-controller 指令都有一个实例。
请注意updated example中的所有内容