• AngularJS学习笔记(3)——通过Ajax获取JSON数据


    通过Ajax获取JSON数据

    以我之前写的与用户交互的动态清单列表为例,使用JSON前todo.html代码如下:

    <!DOCTYPE html>
    <html ng-app="todoApp">
    <head>
        <meta charset="UTF-8">
        <title>TO DO List</title>
        <link href="./bootstrap/css/bootstrap.css" rel="stylesheet"/>
        <link href="./bootstrap/css/bootstrap-theme.css" rel="stylesheet"/>
        <script src="./angularJs/angular.js"></script>
        <script>
    
            var model = {
                user:"Yimi",
                items:[{action:"练车",done:true},
                    {action:"看课外书",done:false}]
            };
    
            var todoApp = angular.module("todoApp",[]);
    
            todoApp.controller("ToDoCtrl",function($scope){ //以$开头的变量名表示AngularJS的内置特性
                $scope.todo = model;
    
                $scope.incompleteCount = function(){
                    var count = 0;
                    angular.forEach($scope.todo.items,function(item){
                        if(!item.done){count++;}
                    });
                    return count;
                }
    
                $scope.warningLevel = function(){
                    return $scope.incompleteCount() < 2 ? "label-success" : "label-warning";
                }
    
                $scope.addNewItem = function(actionText){
                    $scope.todo.items.push({action:actionText, done:false});
                }
    
            });
    
        </script>
    </head>
    <body ng-controller="ToDoCtrl">
    <div class="page-header">
        <h1>{{todo.user}}'s TO DO List
        <!--添加ng-hide="incompleteCount() == 0"使未办事项数为0时不显示此标签-->
        <span class="label label-default" ng-hide="incompleteCount() == 0" ng-class="warningLevel()">{{incompleteCount()}}</span></h1>
    </div>
    <div class="panel">
        <div class="input-group">
            <input class="form-control" ng-model="actionText"/>
            <span class="input-group-btn">
                    <button class="btn btn-default" ng-click="addNewItem(actionText)">Add</button>
            </span>
        </div>
        <table class="table table-striped">
            <thead>
            <tr>
                <th>Description</th>
                <th>Done</th>
            </tr>
            </thead>
            <tbody>
            <tr ng-repeat="item in todo.items">
                <td>{{item.action}}</td>
                <td><input type="checkbox" ng-model="item.done"/></td>
                <td>{{item.done}}</td>
            </tr>
            </tbody>
        </table>
    </div>
    </body>
    </html>

    效果图如下: 
    效果图


    现在把模型model内的items中的值单独写成一个JSON文件,再通过发起Ajax请求的方式获取JSON数据。

    1.把todo.html文件内的模型model去除直接定义的items,改成如下形式:

     var model = {
                user: "admin"
            };

    2.新建todo.json文件并编写如下代码:

    [
      {"action": "练车","done": false},
      {"action": "看书","done": true}
    ]

    3.发起Ajax请求的方式获取JSON数据:

    ......
    todoApp.run(function ($http) {
                $http.get("./todo.json").success(function (data) {
                    model.items = data;
                    console.log("data:" ,data );
                    console.log("items:" , model.items)
                });
            });
    ......

    现在,清单列表中的数据项就都是通过JSON数据来传递的了,使用Chrome可以浏览器查看时可以按F12看到NetWork的状态,状态码为200即成功获取。可以看到todo.json的数据成功获取到了: 
    通过Ajax获取JSON数据
    而且显示的页面效果与原先一致。


    完整源码(css/js文件需自己额外设置): 
    todo.html

    <!DOCTYPE html>
    <html ng-app="todoApp">
    <head>
        <meta charset="UTF-8">
        <title>TO DO List</title>
        <link href="./bootstrap/css/bootstrap.css" rel="stylesheet"/>
        <link href="./bootstrap/css/bootstrap-theme.css" rel="stylesheet"/>
        <script src="./angularJs/angular.js"></script>
        <script>
    
            var model = {
                user: "Yimi"
            };
    
            var todoApp = angular.module("todoApp", []);
            todoApp.run(function ($http) {
                $http.get("./todo.json").success(function (data) {
                    model.items = data;
                    console.log("data:" ,data );
                    console.log("items:" , model.items)
                });
            });
    
            todoApp.controller("ToDoCtrl", function ($scope) {
                $scope.todo = model;
    
                $scope.incompleteCount = function () {
                    var count = 0;
                    angular.forEach($scope.todo.items, function (item) {
                        if (!item.done) {
                            count++;
                        }
                    });
                    return count;
                }
    
                $scope.warningLevel = function () {
                    return $scope.incompleteCount() < 2 ? "label-success" : "label-warning";
                }
    
                $scope.addNewItem = function (actionText) {
                    $scope.todo.items.push({action: actionText, done: false});
                }
    
            });
    
        </script>
    </head>
    <body ng-controller="ToDoCtrl">
    <div class="page-header">
        <h1>{{todo.user}}'s TO DO List
            <!--添加ng-hide="incompleteCount() == 0"使未办事项数为0时不显示此标签-->
            <span class="label label-default" ng-hide="incompleteCount() == 0" ng-class="warningLevel()">{{incompleteCount()}}</span>
        </h1>
    </div>
    <div class="panel">
        <div class="input-group">
            <input class="form-control" ng-model="actionText"/>
            <span class="input-group-btn">
                    <button class="btn btn-default" ng-click="addNewItem(actionText)">Add</button>
            </span>
        </div>
        <table class="table table-striped">
            <thead>
            <tr>
                <th>Description</th>
                <th>Done</th>
                <th></th>
            </tr>
            </thead>
            <tbody>
            <tr ng-repeat="item in todo.items">
                <td>{{item.action}}</td>
                <td><input type="checkbox" ng-model="item.done"/></td>
                <td>{{item.done}}</td>
            </tr>
            </tbody>
        </table>
    </div>
    </body>
    </html>

    todo.json

    [
      {"action": "练车","done": false},
      {"action": "看书","done": true}
    ]
  • 相关阅读:
    Vuex的使用
    vue的props属性,vue的插槽
    ES6 Promise对象
    ES6 Map对象以及Set对象
    函数作用域以及块级作用域
    组件之间的传值-$refs&$parent
    Vue中父子组件的传值
    v-on 以及v-model的修饰符以及vue的常用指令
    时间线
    readline和xreadline的区别
  • 原文地址:https://www.cnblogs.com/benmumu/p/9025171.html
Copyright © 2020-2023  润新知