AngularJS-子控制器专用范围(防止继承)

AngularJS-子控制器专用范围(防止继承),angularjs,angularjs-scope,Angularjs,Angularjs Scope,我有一个需要嵌套控制器的案例。我不希望子作用域从父作用域继承,因为我在两个控制器中都有同名的作用域变量。有办法做到这一点吗 我试图阻止更改parentController的变量时更新childController的变量 <div ng-controller="parentController"> {{myVariable}} <div ng-controller="childController"> {{myVariable}}

我有一个需要嵌套控制器的案例。我不希望子作用域从父作用域继承,因为我在两个控制器中都有同名的作用域变量。有办法做到这一点吗

我试图阻止更改parentController的变量时更新childController的变量

<div ng-controller="parentController">
     {{myVariable}}
     <div ng-controller="childController">
          {{myVariable}}
     </div>
</div>

{{myVariable}}
{{myVariable}}
我知道我可以更改子控制器的scope变量的名称,以完全避免继承问题,但我正在寻找替代方法。有什么已知的方法可以做到这一点吗

有点像隔离指令的作用域,但是隔离的或私有的控制器作用域

编辑:我发现,当在子控制器中没有为该变量设置默认值时,子控制器将继承父控制器范围变量值


比较:与

相比,我在开发自己的表单时遇到了这个问题。我来这里是为了找不到回应。所以我自己想出来了。所以对于你的代码

<div ng-controller="parentController">
     {{myVariable}}
     <div ng-controller="childController">
          {{myVariable}}
     </div>
</div>
我知道答案已经很晚了,但希望那些从现在开始遇到这个问题的人会觉得它很有帮助

试试这个:

<div ng-controller="parentController as parent">
     {{parent.myVariable}}
     <div ng-controller="childController as child">
          {{child.myVariable}}
     </div>
</div>

实现这一点的一种方法是在子控制器中使用
Object.defineProperty

.controller('childController',  ['$scope', function($scope){
    Object.defineProperty($scope, 'myVariable', { value: 'childControllerValue', writable: true });
}])
这将在子作用域上创建一个变量
myVariable
,该变量可以独立于父作用域上具有相同名称的变量进行设置

角度继承之所以有效,是因为父作用域是子作用域的原型,因此如果在子作用域中尝试访问或分配给
$scope.myVariable
,javascript会在内部查找原型链,并实际访问
$scope.\uuuuu proto\uuuu.myVariable
。通过直接在对象上定义新属性,可以屏蔽此继承属性,从而允许独立值


当在视图中使用
{{myVariable}}
时,此操作有效。我也用watchers对它进行了测试,它将监视其作用域上的变量,而不是它的父或子版本。有关一些测试,请参阅。

创建一个范围为空的transclude指令怎么样?还有你的孩子,真有趣!我会调查一下的。你介意举个例子说明你的想法吗?问题到底是什么?子div将显示来自子控制器的myVariable,父div将显示来自父控制器的myVariable。这不是你想要的吗?不,父对象不能覆盖子范围中的任何内容。你这样做很好。您也可以考虑使用<代码>控制器作为< /COD>语法(),但我个人不喜欢它。
.controller('childController',  [, function(){
     var vm = this; // You can use now vm like $scope
}])
.controller('childController',  ['$scope', function($scope){
    Object.defineProperty($scope, 'myVariable', { value: 'childControllerValue', writable: true });
}])