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

时间:2015-07-27 12:43:29

标签: javascript angularjs angularjs-scope frontend angularjs-controller

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

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>

我所有的其他视图(使用控制器)都有一个带有ng-click的按钮,我用它来访问上面的$ scope.toggleMenu()函数和ng-class,但这不起作用,我不知道#39; t得到任何错误:

view1.html:

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

View1.js:

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

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

另外,我之所以这样做的原因是因为我的导航栏在我的整个应用程序中都是持久的。这有可能违背最佳做法吗?

1 个答案:

答案 0 :(得分:2)

如果您使用的是.. 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

的进一步提示