如何在AngularJS中防止子控制器继承父控制器的作用域?

3

如果在AngularJS中有一个嵌套控制器(一个控制器继承自另一个控制器),如何使子控制器无法访问父控制器的作用域?这是我在面试中被问到的问题。


2
如果你有意选择使用继承,为什么还要避免使用继承呢? - George Stocker
也许你正在寻找 Angular 中的一个特性,叫做“隔离作用域”。可以在这里查看更多信息:http://onehungrymind.com/angularjs-sticky-notes-pt-2-isolated-scope/。同时,在这里也可以获得更详细的介绍:https://github.com/angular/angular.js/wiki/Understanding-Scopes。 - Hinrich
1
实际上,这个问题是在我参加一家跨国公司的面试时被问到的。所以想知道是否有任何方法可以解决它。 - parag baheti
使用服务、工厂或隔离作用域,我们可以避免继承。 - Mukund Kumar
如果隔离作用域不是指令的一部分,那么我们该如何避免它? - parag baheti
我同意隔离作用域是与指令相关的功能。有两种可能性。1)子控制器应该重构为指令。2)这是没有人想做的事情;-) - Raulucco
2个回答

2

仅使用ng-controller无法隔离作用域,但是您可以通过在控制器上返回方法而不将它们放在作用域上来隔离这些方法。

.controller('myCtrl', function() {
    return {
        doStuff: function() {
        }
    }
})

子控制器将无法访问doStuff函数。使用它的唯一方法是使用controller as

<div ng-controller="myCtrl as parentCtrl">
    <button ng-click="parentCtrl.doStuff()"/>
</div>

2

无法隔离控制器的作用域:

以下内容创建新的作用域,并且从原型继承:ng-repeat、ng-include、ng-switch、ng-view、ng-controller、具有scope:true指令、具有transclude:true指令。 文档

为了创建一个隔离的作用域,你应该使用指令而不是控制器。确保在指令声明中定义了一个scope属性。文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接