AngularJS $ scope和Controller之间是否真的没有区别?

时间:2016-02-09 02:29:25

标签: javascript angularjs angularjs-scope angularjs-ng-repeat angularjs-controlleras

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

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

3 个答案:

答案 0 :(得分:2)

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

两种形式的控制器控制器和控制器一样是功能。与我理解的主要区别在于,当使用新关键字调用调用时,这就是为什么'这个'语法有效。这也是您可以使用Controller As语法进行原型继承的原因,而您无法使用常规的Controller语法执行此操作。关于Controller As的另一个很酷的部分是你可以放置范围变量的命名空间,在HTML中,很容易推断哪些部分转到哪个控制器。如果你愿意我可以举例,但这是我理解的核心差异。

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

答案 2 :(得分:1)

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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="P1 Test Suite" verbose="1">

<test name="test1">
    <classes>
        <class name="com.class1"/>
    </classes>
</test>


<test name="test2">
    <classes>
        <class name="com.class2"/>
    </classes>
</test>

<test name="test3">
    <classes>
        <class name="com.test3"/>
    </classes>
</test>


</suite>