何时直接使用$ scope?

CWa*_*ner 12 angularjs angularjs-scope

我刚开始使用Angular并且已经阅读了很多教程.现在CodeSchool的免费版本是我的起点,完全没有提到$scope.

从我收集的内容来看,controllerAs语法相对较新(1.2.0),但它似乎可以让你在不使用的情况下逃脱$scope.

有些文章说"使用controllerAs"有解释,但大多数只是使用$scope.但我找不到他们为什么选择它的任何解释.

这现在主要是支持一个优先于另一个还是仍然有理由使用$scope

甚至许多新的指令插件都使用它而不是允许你将它绑定到特定的控制器.

编辑:澄清一下,我想知道何时使用$scope,而不是不使用它的原因:)

JPR*_*PRO 12

ngController的Angular文档中,它解释了使用'controller as'与注入$ scope的优点.这就是它所说的:

  • 当多个控制器应用于元素时,使用控制器可以明显地在模板中访问哪个控制器.
  • 如果您将控制器编写为类,则可以从控制器代码内部更轻松地访问将在范围内显示的属性和方法.
  • 因为总有一个.在绑定中,您不必担心原型继承掩盖原语.

就我个人而言,我发现使用'controller as'是非常有益的,因为它迫使我考虑我添加到控制器的代码是否会更恰当地添加到服务或指令中.

例如:手表.手表是控制器中应该避免的,但是可以轻松访问$ scope,这样您就可以轻松设置它们.使用'controller as'迫使我更仔细地考虑是否真的需要做手表.通常手表可以通过指令完成.这导致我创建了较小的控制器,只建立初始状态并与服务进行通信,我发现这种模式更具性能和可维护性.


Ste*_*ker 4

我能给你的最好答案是:

短:

  • 每当您想要向模板公开逻辑时,请使用Scope.
  • 每当您想要将逻辑保留到元素时,请使用ngController.
  • 如果您想直接在模板中公开控制器的值(通过范围),请使用“控制器作为语法”。

长的:

一个解释

Scope或者$scope,正如您所说,是我们维护该范围内模板可用的值(无论类型:函数、对象、字符串等)的地方。例如,请考虑以下情况:

HTML:

<div ng-controller="MyCtrl">
  <div>{{ message }}</div>
</div>

<div ng-controller="MyCtrl as ctrl">
  <div>{{ ctrl.message }}</div>
</div>
Run Code Online (Sandbox Code Playgroud)

看到那些插值了吗?嗯,你猜怎么着?他们都在访问Scope. “控制器作为语法”创建别名MyCtrl并将其发布到本地范围。一旦链接了元素,如果您查看,$scope您实际上会发现一个ctrl公开控制器的属性。

JavaScript

function MyCtrl($scope) {
  $scope.message = "controller MyCtrl";
  this.message = "controller as syntax";
}
Run Code Online (Sandbox Code Playgroud)

无论我在哪里使用MyCtrl这两条消息都可用。但为了轻松访问控制器本身的值,我们使用“控制器作为别名”语法。

老实说,它们是两种不同的方法。控制器 as * 语法允许开发人员将控制器放入作用域并更轻松地访问所述控制器。所以,最终一切都在范围内结束。否则,通过指令的链接函数,您必须访问控制器的属性require控制器的方法和属性不一定需要暴露给模板,而只需在逻辑中使用。(此外,您还可以通过 jqLit​​e 的 data() 函数访问控制器)。

有时,当将控制器传播到多个元素时,我们希望默认情况下每个使用该控制器的元素都可以使用某些东西。这在创建指令时特别有价值。看一下 ngModel,看看我们如何为使用 ngModel 的每个元素提供多种通用方法。

范围与控制器

要考虑的主要事情是子控制器可以继承其父控制器的范围。很酷的事情是子作用域将从父作用域继承父控制器属性。

<!-- ctrl1 -->
<div ng-controller="MyCtrl as ctrl1">
  <div>{{ ctrl1.message }}</div>
  <!-- ctrl2 -->
  <div ng-controller="MyCtrl as ctrl2">
    <div>{{ ctrl2.message }}</div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

请注意,两者都使用相同的控制器,但它们具有不同的别名。现在,控制器属性通过 传递给子级Scope。因此子级可以通过其别名访问父级。所以,通过这个语法你可以清楚地看到MyCtrl的两个实例的分离。他们message的范围都有属性,但无需深入挖掘父母、孩子、兄弟姐妹等即可轻松区分。

综上所述

如果您想向模板使用范围公开值。如果要将值绑定到不一定需要在模板中公开的元素,请使用控制器。如果您需要从模板中的控制器访问值,请使用控制器 as 语法。使用控制器 as * 语法将控制器的值放置在语法中创建的别名下的范围内。因此,在这种情况下,您将同时使用控制器和范围。