父控制器无法访问新的子范围有什么意义? (由ng-指令创建)

时间:2014-10-06 12:41:45

标签: angularjs angularjs-scope

在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;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

首先,您需要了解范围控制器是两个独立的概念。

范围是一个引用您的应用程序模型的对象,而控制器是一个用于操作范围的构造函数。

所以,&#34;从Angular的观点来看,如果一个范围没有被控制器增强,那么它是完全可以接受的。

创建新子范围的想法是使用逻辑方法来分离应用程序的模型。你能想象你的整个申请只有一个范围吗?在操作控制器中的作用域时,您必须非常小心不要覆盖函数或属性。由于孩子范围prototypically inherit from their parent scope,您不必担心这一点。

这些子范围的可用性的一个实际例子是,例如,当你有两个ng-repeat指令并排,&#34;&#34;相同的范围。如果他们没有创建自己的子范围,您将如何访问每个{{1}的$index$first$last等属性指令?如果没有子女的范围,两者都会污染父母和父母。具有相同属性的范围,相互重叠。

您可以阅读有关范围here和控制器here的更多信息。

答案 1 :(得分:1)

特别是对于ngInclude,这是设计的:在许多情况下,您希望隔离包含的内容。

如果没有与其一起使用的js代码,范围确实没有意义,但该代码可能位于控制器或链接函数中,或者(如ngInclude的情况下)postLink函数。

另请参阅 How to include one partials into other without creating a new scope? ,这几乎是重复的并且有解决方法。

相关问题