控制器ng-controller

控制器ng-controller是使用AngularJS的核心功能之一。在前一节我们已经了解了作用域的概念,ng-controller则是真正应用作用域来制作功能的核心部分。

应用ng-controller和应用ng-app类似,下面我们来尝试创建一个控制器吧!

还是在app.js中,我们创建一个控制器,代码如下:

  1. //app.js
  2. var App = angular.module("App", []);
  3. App.controller("FirstCtrl", function($scope){
  4. $scope.data = {
  5. message : "Hello"
  6. };
  7. });

同时,我们在index.html中进行一些代码修改,最终代码如下:

  1. <!DOCTYPE html>
  2. <html lang="zh" ng-app="App">
  3. <head>
  4. <meta charset="UTF-8">
  5. <!-- 网页的标题,我们在这里使用了AngularJS的基本表达式 -->
  6. <title>{{"学习AngularJS 1.x"}}</title>
  7. </head>
  8. <body>
  9. <!-- 将FirstCtrl绑定到这个div标签上,这个标签中的内容将可以使用FirstCtrl中的数据-->
  10. <div ng-controller="FirstCtrl">
  11. <h1>{{data.message + " World!"}}</h1>
  12. </div>
  13. <!-- 以下表达式不会输出任何内容,因为它在FirstCtrl之外-->
  14. <p>下面的内容不会显示</p>
  15. <p>{{data.message}}</p>
  16. <script type="text/javascript" src="components/angular/angular.js"></script>
  17. <script type="text/javascript" src="js/app.js"></script>
  18. </body>
  19. </html>

刷新页面,我们可以看到运行的效果:

图4-2 ng-controller运行结果

下面,我们再来分析下ng-controller的具体形式:

ng-controller详解

JavaScript部分

我们先分析ng-controller的JavaScript编码部分

  1. //原有的ng-app声明部分
  2. var App = angular.module("App", []);
  3. /**
  4. * App.controller 声明ng-controller的方法
  5. * “FirstCtrl” 这个ng-controller的名称
  6. * function($scope){} 这个ng-controller的实体,并注入$scope(下文详解)
  7. */
  8. App.controller("FirstCtrl", function($scope){
  9. $scope.data = {
  10. message : "Hello"
  11. };
  12. });

function($scope){}详解

funtion(){}封装的函数,会被绑定到FirstCtrl上。这个概念相对容易理解,我们需要注意的,是我们在function中传入的参数$scope

与一般的函数声明时的参数不同,此处的参数是不可随意命名的,AngularJS会解析参数的名称,并转化为对应的对象传入。

这里使用的$scope,用于将ng-controller中的数据和HTML代码绑定起来,传入$scope的数据,可以直接在HTML代码中调用。在上面的例子中,我们对$scope传入了{data:{message:"Hello"}}对象,并在HTML代码中直接使用了data.message来调用。

data命名并不是固定用法,我们也可以使用$scope.shuju = {m:"hello"}。(这里只是为了表明变量命名的约束,如果可能,请不要使用拼音命名的变量)。

值得注意的是,$scope之下除了可以传入数据外,还可以传入其他函数,比如我们声明一个onClick函数传入$scope之后,可在HTML页面中调用这个功能,实现比如按钮点击触发功能的效果。

HTML中调用ng-controller中的数据

  1. <h1>{{data.message + " World!"}}</h1>

$scope中传入数据后,通过表达式可以直接调用。

为什么要额外封装一层

在AngularJS中,最简单传入数据的方法其实可以更简单,但是不推荐这样做

最简单的做法

  1. //JavaScript
  2. $scope.message = "Hello";
  1. //HTML
  2. <div ng-controller="FirstCtrl">
  3. {{message}}
  4. </div>

为什么不推荐这样做呢?因为在我们后续会学习应用filterdirective等功能时,或者将数据在多个ng-controller之间共享时,如果不对数据进行二次封装,可能会导致数据互相访问不了的情况。在使用AngularJS的时候,养成数据二次封装的习惯,可以避免很多这样的问题。