在angular.js中,某些指令会创建子范围。 (ng-include,ng-if等)
我知道有办法解决它,例如通过声明控制器范围内的变量。只需取消注释//$scope.inner = '1234'
并删除ng-init="inner='1234'
即可。
另一种解决方案是使用包含变量的父作用域中的对象。
对我来说仍然没有意义。
没有控制器的范围有什么意义? 这些新的儿童范围有什么实际用途?
这是我的榜样。
var app = angular.module('app', []);
app.controller('ctrl', ['$scope', function($scope) {
$scope.result = "Result";
$scope.outer = "outer";
//$scope.inner = "1234";
$scope.test1 = function() {
if ($scope.inner) {
$scope.result = $scope.inner;
} else {
alert("inner is not accesible");
}
}
$scope.test2 = function() {
if ($scope.outer) {
$scope.result = $scope.outer;
} else {
alert("inner2 is not accesible");
}
}
}]);

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="ctrl" >
<script type="text/ng-template" id="/tpl.html">
<input type="text" ng-init="inner='Inner'" ng-model="inner"></input>
<button ng-click="test1()">TEST1</button>
</script>
<div>
<ng-include src="'/tpl.html'"></ng-include>
<br/>
<input type="text" ng-model="outer"></input>
<button ng-click="test2()">TEST2</button>
<p>{{result}}</p>
</div>
</div>
&#13;
答案 0 :(得分:1)
首先,您需要了解范围和控制器是两个独立的概念。
范围是一个引用您的应用程序模型的对象,而控制器是一个用于操作范围的构造函数。
所以,&#34;从Angular的观点来看,如果一个范围没有被控制器增强,那么它是完全可以接受的。
创建新子范围的想法是使用逻辑方法来分离应用程序的模型。你能想象你的整个申请只有一个范围吗?在操作控制器中的作用域时,您必须非常小心不要覆盖函数或属性。由于孩子范围prototypically inherit from their parent scope,您不必担心这一点。
这些子范围的可用性的一个实际例子是,例如,当你有两个ng-repeat
指令并排,&#34;&#34;相同的范围。如果他们没有创建自己的子范围,您将如何访问每个{{1}的$index
,$first
,$last
等属性指令?如果没有子女的范围,两者都会污染父母和父母。具有相同属性的范围,相互重叠。
答案 1 :(得分:1)
特别是对于ngInclude,这是设计的:在许多情况下,您希望隔离包含的内容。
如果没有与其一起使用的js代码,范围确实没有意义,但该代码可能位于控制器或链接函数中,或者(如ngInclude的情况下)postLink函数。
另请参阅 How to include one partials into other without creating a new scope? ,这几乎是重复的并且有解决方法。