无法从包含 ng 的控制器访问 $parent

Can't access $parent from ng-included controller

我是 Angular 的新手,我正在尝试构建一个应用程序。

我使用 ng-include 插入我的视图,这取决于我的主控制器的 currentURL 变量。 当我尝试通过 $parentng-included 文件访问主控制器时,我得到的只是 undefined.

我的目标是更改 currentURL 变量来更新视图。

这是我的代码:

index.html

<body ng-controller="mainCtrl as main">
    currentURL : {{main.currentURL}}
    <div ng-include="main.currentURL"></div>

    <script src="/vendors/angular.min.js"></script>
    <script src="/modules/login.js"></script>
    <script src="app.js"></script>
</body>

app.js

angular
    .module('mcaApp', ['login'])
    .controller('mainCtrl', mainCtrl);

function mainCtrl() {
    var vm = this,
        baseURL = 'views/';
    vm.currentURL = baseURL + 'login.html';
}

views/login.html

<div ng-controller="loginCtrl as login">
    <h1>LOGIN</h1>
</div>

modules/login.js

angular
    .module('login', [])
    .controller('loginCtrl', loginCtrl);

function loginCtrl() {
    var vm = this;

    console.log(vm.$parent); // undefined
}

因为你想访问 loginCtrl 控制器中的 mainCtrl 那么你需要使用 $parent 来访问父控制器范围。

但问题是您正在使用 ng-include 加载 loginCtrl 控制器视图,因此您的控制器被加载到 mainCtrl 的子范围内,因为 ng-include 创建当前范围的子范围。

因此,您需要使用 $parent.$parentloginCtrl

访问 mainCtrl 范围

代码

function loginCtrl($scope) {
    var vm = this;

    console.log($scope.$parent.$parent); // this would contain mainCtrl
}

更好的方法是在定义对象时使用 controllerAs 语法或遵循点规则,以便遵循原型继承。