Angular1.3:在使用 controllerAs 的视图中从标准控制器访问函数?

Angular1.3: Access functions from standard controllers, inside a view which uses controllerAs?

我在主 app.js 文件中定义了一个简单的控制器,它控制 opening/closing 我的导航栏并且在我的应用程序的所有其他视图中可见:

app.js:

.controller('mainController', ['$scope', function($scope){
  $scope.menuActive = false;

  $scope.toggleMenu = function(){
    $scope.menuActive = !$scope.menuActive;
  }
}]);

index.html:

<nav class="side-menu"  ng-class="{ 'side-menu-open' : menuActive }">
    <ul>
      <li>LINK1</li>
      <li>LINK2</li>
    </ul>
</nav>

<!--Other views::.....-->
<div ui-view></div>

我的所有其他视图(使用 controllerAs)都有一个带 ng-click 的按钮,我用它来访问上面的 $scope.toggleMenu() 函数和 ng-class,但是这不起作用,我也没有收到任何错误:

view1.html :

<span class="btn btn-default"
        ng-click="toggleMenu()">
    MENU
</span>

View1.js:

angular
 .module('myApp.view1', [])

 .controller('View1Ctrl', [
      function(){
      ................
       }
    ]);

此外,我再次这样做的原因是因为我的导航栏在我的应用程序中一直存在。这是否有违最佳实践?

如果您使用 .. controller as .. 语法,请确保您将它用于所有控制器。不要挑剔。

接下来,使用语法时,不需要注入$scope对象。您需要改为使用 this 变量,并将通常与 $scope 对象关联的任何属性或函数附加到 this 对象。

因此,

$scope.toggleMenu = function(){
    $scope.menuActive = !$scope.menuActive;
}

变成

this.toggleMenu = function(){
    this.menuActive = !this.menuActive;
}

最后,在您看来,一定要将每个表达式与控制器相关联。

<div ng-controller="mainController as main">
    <nav class="side-menu"  ng-class="{ 'side-menu-open' : main.menuActive }">
        <ul>
            <li>LINK1</li>
            <li>LINK2</li>
        </ul>
    </nav>
    <div ui-view>
        <!-- Assuming that the following gets compiled to ui-view -->
        <span class="btn btn-default" ng-click="main.toggleMenu()">
            MENU
        </span>
    </div>
</div>

您可以获得一些关于使用 controller as 语法的进一步提示 here