1

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

但是,我在这里发布了另一个关于 SO的问题,回答该问题的用户说即使我使用控制器作为语法,我仍然必须注入 $scope 才能使用“ui select”指令。它是哪一个?如果我不必使用 $scope,我缺少什么来让“控制器作为”语法与 ui-select 一起工作?

4

3 回答 3

2

对不起,这很长,没有例子。

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

于 2016-02-09T02:37:10.310 回答
1

该语法将您的控制器暴露给模板,因此您可以将它们设置为控制器实例的属性,controllerAs而不是在控制器中绑定一堆属性。$scope(控制器是 JavaScript“类”构造函数。)

因此,如果您有以下情况:

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了控制器,你应该质疑你的方法。最好通过链接函数创建自定义指令和访问范围,或者从模板访问范围。

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

于 2016-02-09T02:46:11.117 回答
1

控制器很好,因为您可以嵌套 ng-controllers 并知道您正在操作哪个控制器

<div ng-controller="Ctrl1 as c1">
  <--Using c1 here -->
  <div ng-controller="Ctrl2 as c2">
  <-- Using c2 here -->
  </div>
  <--Using c1 here -->
</div>
于 2016-02-09T04:54:16.253 回答