AngularJs : ui-router *require* 我是否需要将 $scope 注入我的控制器(即使使用 Controller As 语法)?

AngularJs : does ui-router *require* me to inject $scope into my controller (even with Controller As syntax)?

"Controller As" 语法的优点之一是它将我们从 $scope 中解放出来。

但是,我遇到的问题似乎表明 ui-router 需要 $scope - 可能访问状态。

有多个类似的问题,没有一个令人满意的答案,所以我正在寻找一个规范的答案,我可以参考其他问题。

  1. 是否ui-router需要我将$scope注入我的控制器,甚至如果控制器代码从不引用 $scope(因为我使用的是 "controller as" 语法)? ( seems to imply that it does. Also, removing the injection of $scope into this working Plunker 的答案打破了它)

  2. 我可以避免这种情况吗(可能通过告诉我的 ui-router 配置从 "controller as" 声明的控制器获取状态)?

也许下面的代码可能有用。

var myApp = angular.module('helloworld', ['ui.router'])
.config(function($stateProvider) {
  var helloState = {
    name: 'hello',
    url: '/hello',
    template: '<h3>hello world!</h3>'
  }
  
  class AboutStateController {
    constructor() {
      this.name = 'John Dow';
    }
  }
 
  var aboutState = {
    name: 'about',
    url: '/about',
    template: '<h3>Hello <span>{{aboutStateController.name}}</span></h3>',
    controller: AboutStateController,
    controllerAs: 'aboutStateController'
  }

  $stateProvider.state(helloState);
  $stateProvider.state(aboutState);
});

angular.bootstrap(document.body, ['helloworld']);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<script src="//unpkg.com/@uirouter/angularjs/release/angular-ui-router.min.js"></script>

    <a ui-sref="hello" ui-sref-active="active">Hello</a>
    <a ui-sref="about" ui-sref-active="active">About</a>

    <ui-view></ui-view>

不,UI-路由器在它的控制器中不需要$scope:

myapp.controller('MicrositeController', ['$state', '$mdMedia', '$mdSidenav',
 function($state, $mdMedia, $mdSidenav) {
  console.log("MicrositeController instantiated");
  var vm = this;
  vm.page_name = $state.current.data.page_name;
  vm.sidenav_locked_open = false;

  vm.toggleSideNav = function() {
    if ($mdMedia('gt-sm')) {
      vm.sidenav_locked_open = !vm.sidenav_locked_open;
    } else {
      $mdSidenav('left').toggle();
    }
  }
}]);
$stateProvider
  .state('microsite', {
      url: "/",
      templateUrl: "microsite.tmpl.html",
      //Put controller on root state
      controller: 'MicrositeController as vm',
      abstract: true
})

DEMO on PLNKR