何时直接使用$ scope?

时间:2014-06-20 15:02:16

标签: angularjs angularjs-scope

我刚开始使用Angular并且已经阅读了很多教程。 现在the free one at CodeSchool这是我的起点,根本没有提到$scope

根据我收集的内容,controllerAs语法相对较新(1.2.0),但它似乎允许您在不直接使用$scope的情况下离开。

有些文章说“使用controllerAs”并附有解释,但大多数文章只使用$scope。但我找不到任何解释为什么他们会选择它。

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

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

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

4 个答案:

答案 0 :(得分:12)

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

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

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

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

答案 1 :(得分: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>

看那些插值?好吧,猜猜怎么着?他们都访问Scope。 “controller as syntax”为MyCtrl创建别名,并在本地范围内发布。链接元素后,如果查看$scope,您实际上会找到一个公开控制器的属性ctrl

Javascript

function MyCtrl($scope) {
  $scope.message = "controller MyCtrl";
  this.message = "controller as syntax";
}

我在哪里使用MyCtrl这两条消息都可用。但是为了方便地访问控制器本身的值,我们使用“controller as alias”语法。

他们老实说是两种不同的方法。控制器*语法允许开发人员将控制器放在示波器上,更容易访问所述控制器。所以,最终它都会在范围内结束。否则,通过指令的链接功能,您必须访问控制器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>

请注意,两者都使用相同的控制器,但它们具有不同的别名。现在,控制器属性通过Scope传递给子节点。所以孩子可以通过它的别名访问父母。因此,通过这种语法,您可以清楚地看到MyCtrl的两个实例的分离。他们的范围都有message属性,但很容易区分,而不是通过父母,孩子,兄弟姐妹等进行挖掘。

结论

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

答案 2 :(得分:1)

正如Angular文档中所述,好处是

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

我非常喜欢它,因为它可以轻松区分我当前正在访问的控制器。

答案 3 :(得分:0)

我阅读了一些博客并得出结论用于使用目的不要混合$ scope和this。 这是有道理的,&#34;这个&#34;并且$ scope可以是不同的,例如它们并不总是相同的 - 如果我在&#34上定义了一个控制器,那么这个&#34;然后我在其中调用另一个控制器,然后将$ scope设置为我调用的控制器,但是&#34;这个&#34;将始终是我调用另一个控制器的控制器的当前上下文。 所以在这种情况下,$ scope和&#34;这个&#34;将不会相同,并在这里互换使用它们可能会导致一些无法预料的行为。

如果我错了,请纠正我。