AngularJS $scope 和 Controller 作为语法真的没有区别吗?

Is there really no difference between AngularJS $scope and Controller as syntax?

我正在学习 angularJS 并且在学习过程中发现控制器作为语法更容易阅读,对于来自 OO 世界的我来说也更容易理解。我已经阅读了几篇文章和 SO 答案,它们似乎都指向 $scope 并且 'controller as ' 语法相同,而 'controller as' 语法只是语法糖。

但是,我在 SO 上发布了另一个问题,回答该问题的用户说我仍然必须注入 $scope 才能使用 'ui select' 指令,即使我正在使用控制器作为语法。是哪个?如果我不必使用 $scope,我缺少什么来获得 'controller as' 语法来使用 ui-select?

很抱歉,这太长了,没有示例。

Controller 和 Controller As 两种形式的控制器都是函数。我理解的主要区别是 Controller As when called 是使用 new 关键字调用的,这就是 'this' 语法起作用的原因。这也是为什么您可以使用 Controller As 语法进行原型继承,而不能使用普通的 Controller 语法进行原型继承。关于 Controller 的另一个很酷的部分是命名空间,你可以在其中放置范围变量,这意味着在 HTML 中很容易推断出哪些部分去哪个控制器。如果你愿意,我可以举个例子,但这是我理解的核心区别。

controllerAs 语法将您的控制器暴露给模板,因此与其将一堆属性绑定到控制器中的 $scope,您可以使它们成为控制器实例的属性。 (控制器是 JavaScript "class" 构造函数。)

所以如果你有以下情况:

angular.module('myApp')
  .controlller('MyController', function() {
    var vm = this;
    vm.foo = 'bar';
  });

...您可以像这样在您的模板中访问它:

<div ng-controller="MyController as vm">
  {{ vm.foo }}
</div>

现在,如果您想访问控制器中的作用域变量——或调用 $on 等作用域方法——您仍然需要将 $scope 注入控制器。请注意作用域前的 $,表示它是一项服务。此 $scope 服务仅公开当前范围。

综上所述,如果您发现自己将 $scope 注入您的控制器,您应该质疑您的方法。最好通过 link 函数创建自定义指令和访问范围,或者从模板访问范围。

推荐阅读:http://www.johnpapa.net/do-you-like-your-angular-controllers-with-or-without-sugar/

controller 很好,因为你可以嵌套 ng-controller 并知道你在哪个控制器上操作

<div ng-controller="Ctrl1 as c1">
  <--Using c1 here -->
  <div ng-controller="Ctrl2 as c2">
  <-- Using c2 here -->
  </div>
  <--Using c1 here -->
</div>