• 控制器ng-controller
    • ng-controller详解
      • JavaScript部分
        • function($scope){}详解
      • HTML中调用ng-controller中的数据
      • 为什么要额外封装一层

    控制器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的时候,养成数据二次封装的习惯,可以避免很多这样的问题。