angularjs初学之todoList练习

刚开始学ng,通过todo练习初步感受到ng框架的强大功能,记录下过程中出现的几个问题:

1、使用localStorage存储数据,序列化的时候使用angular.toJson,因为ng-repeat会在数组对象内部添加$$hashkey属性,使用JSON.stringify序列化不会过滤

2、练习用的是1.4版本的ng,网上很多示例是早期的版本,语法上有不少变化,琢磨了半天

源码下载地址:http://download.csdn.net/detail/sweetsuzyhyf/8752097

引用了bootstrap3的样式文件,效果图:

HTML:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>taskList</title>
    <meta charset="utf-8" />
    <link href="bootstrap.min.css" rel="stylesheet" />
    <link href="index.css" rel="stylesheet" />
</head>
<body>
    <div class="container" ng-app="taskList">
        <div ng-controller="TaskController">
            <h1>我的任务列表</h1>
            <form ng-submit="addTask()">
                <input type="text" class="form-control" ng-model="taskText" size="30" placeholder="添加新任务" ng-required="true" />
                <div class="checkbox" ng-show="hasTask()">
                    <label>
                        <input type="checkbox" ng-model="isAllDone" ng-click="allDone()"> 标记所有为已解决
                    </label>
                </div>
            </form>
            <div class="btn-toolbar" ng-show="hasTask()">
                <div class="btn-group" role="group">
                    <button type="button" class="btn btn-default" ng-click="predicate='text'; reverse=!reverse">内容</button>
                    <button type="button" class="btn btn-default" ng-click="predicate='time'; reverse=!reverse">时间</button>
                </div>
                <div class="btn-group" role="group">
                    <button type="button" class="btn btn-default" ng-click="query.done=false">未完成</button>
                    <button type="button" class="btn btn-default" ng-click="query.done=true">已完成</button>
                    <button type="button" class="btn btn-default" ng-click="query.done=''">全部</button>
                </div>
            </div>
            <ul class="taskList">
                <li ng-repeat="task in taskList | filter:query | orderBy:predicate:reverse">
                    <div class="checkbox">
                        <label>
                            <input type="checkbox" ng-model="task.done" ng-click="save()"><span class="done-{{task.done}}">{{task.text}}</span>
                        </label>
                        <button type="button" class="close" ng-click="removeTask(task)" data-dismiss="alert">×</button>
                        <span class="pull-right">{{task.time}}</span>
                    </div>
                </li>
            </ul>
            <div class="count">
                未完成:<span class="badge">{{count()}}</span>,已完成:<span class="badge">{{countDone()}}</span>,总数:<span class="badge">{{taskList.length}}</span>
            </div>
        </div>
    </div>

    <script src="libs/angular.js"></script>
    <script src="index.js"></script>
</body>
</html>

JS:

angular.module('taskList', []).controller('TaskController', function ($scope, dateFilter) {
    var tmp = localStorage.getItem('taskList');

    $scope.taskList = tmp ? angular.fromJson(tmp) : [];

    //统计未完成
    $scope.count = function () {
        var count = 0;
        angular.forEach($scope.taskList, function (task) {
            count += task.done ? 0 : 1;
        });
        return count;
    };

    //统计已完成
    $scope.countDone = function () {
        var count = 0;
        angular.forEach($scope.taskList, function (task) {
            count += task.done ? 1 : 0;
        });
        return count;
    };

    //标记全部完成
    $scope.allDone = function () {
        angular.forEach($scope.taskList, function (task) {
            task.done = $scope.isAllDone;
        });
        $scope.save();
    }

    $scope.hasTask = function () {
        return $scope.taskList.length > 0;
    }

    //新增
    $scope.addTask = function () {
        $scope.taskList.push({ id: $scope.taskList.length + 1, text: $scope.taskText, done: false, time: getNowTime() });
        $scope.taskText = '';
        $scope.save();
    };

    //删除
    $scope.removeTask = function (todo) {
        $scope.taskList.splice($scope.taskList.indexOf(todo), 1);
        $scope.save();
    };

    //保存
    $scope.save = function () {
        //序列化的时候使用angular.toJson,因为ng-repeat会在对象内部添加$$hashkey属性,使用JSON.stringify序列化不会过滤
        localStorage.setItem('taskList', angular.toJson($scope.taskList));
    }

    function getNowTime() {
        return dateFilter(new Date(), 'yyyy-MM-dd HH:mm:ss');
    }
});

CSS:

body {
	padding: 20px 0;
	background-color: #f5f5f5;
}

.container{
    width:600px;
    padding:20px 30px;
    background-color:white;
    border-radius:5px;
    border: 1px solid #e5e5e5;
}

.taskList{
    padding:0;
    margin-top:20px;
}
.taskList li{
    list-style:none;
    border-bottom:1px solid #ddd;
}
.done-true{
    text-decoration:line-through;
}
.close{
    margin-left:10px;
}

时间: 2024-08-09 21:45:33

angularjs初学之todoList练习的相关文章

angularJS初学篇-1添加随笔

1.头部引入angularJS文件 <script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"></script> 2.angularjs指令 ng-app --指定了一个Angularjs的应用程序 ng-app 指令定义了 AngularJS 应用程序的 根元素. ng-app 指令在网页加载完毕时会自动引导(自动初始化)应用程序. 稍后您将学习到 ng-ap

[angularjs]初学小记1

遇到的坑: post提交表单到php,需要手动设定一下头,不然提交的数据后端不识别.还有如果你调用$http方法提交数据时用的是json对象,angular并不会自动将其转为a=1&b=2的格式,这也需要你手动配置一下. 代码如下: app.config(['$routeProvider','$httpProvider',function($routeProvider,$httpProvider){ //路由配置 $routeProvider. when('/',{ templateUrl :

初学AngularJS

这两天开始学习AngularJS,一开始也是受到jQuery的影响,总是会想方设法的用到DOM操作,但随着进一步的熟悉,发现AngularJS有许多jQuery没有的优势,于个人观点看来,它的实现更为直接,比如你想要达到输入框的内容出现视图中,只要在对应位置上用其特定表达式写出即可,这也是我第一次接触到AngularJS的实例. 例1 <html ng-app="demoApp"> …… <input type="text" ng-model=&q

初学微信小程序 TodoList

微信小程序的学习 微信小程序的开始尝试 TodoList 微信开发者工具生成 目录如下: . |-- app.js |-- app.json |-- app.wxss |-- pages | |-- index # 主页 | | |-- index.js | | |-- index.json | | |-- index.wxml | | `-- index.wxss | `-- log # 日志页面 | | |-- log.js | | |-- log.json | | |-- log.wxml

AngularJs的关于路由问题

初学AngularJs一些天,发现AngularJs到最后的时候会很难.刚刚开始的时候特别不容易适应,到中间的部分,还是比较简单,到最后的时候就发现特别难.我看到了网站上说到了AngularJs中,学习路线是比较奇怪的,有些诡异.我想想不知道是不是对的.今天我在学习AngularJs路由知识点的时候,遇到了一些问题,就是路由不到.以下是刚刚开始写的代码. 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4

AngularJS入门笔记

演示了AngularJS的基本使用套路 功能: 使用AngularJS将文本框中输入的值绑定到angularJS的声明变量中去,接着将其显示到<li>标签中 1.声明angular的一个作用模块,这里对应第24行,同时在第2行声明此模块的"作用边界",对应指令ng-app, todoList关键词和第24行对应 2.第25行为module注册controller,其中关键词和第8行ng-controller指令对应 3.在第26行声明变量task, 然后对应这里第10行的n

AngularJS 表达式与ng-bind

初学 多看语法的具体表现  有助于理解 与实际应用 AngularJS 表达式 AngularJS 表达式写在双大括号内:{{ expression }}. AngularJS 表达式把数据绑定到 HTML,这与 ng-bind 指令有异曲同工之妙. AngularJS 将在表达式书写的位置"输出"数据. AngularJS 表达式 很像 JavaScript 表达式:它们可以包含文字.运算符和变量. 实例 {{ 5 + 5 }} 或 {{ firstName + " &qu

AngularJS作用域

AngularJS作用域 一.概要 在AngularJS中,子作用域(child scope)基本上都要继承自父作用域(parent scope). 但,事无绝对,也有特例,那就是指令中scope设置项为对象时,即scope:{…},这将会让指令创建一个并不继承自父作用域的子作用域,我们称之为隔离作用域(isolated scope). 指令中的scope一共可以有三个值,下面我们再来温习下: 指令之scope scope: false 默认值,指令不会新建一个作用域,使用父级作用域. scop

C# webApi 与 AngularJs 实现增删改Demo 讲解(一)

公司在使用webAPI+AngularJs+SlcikGrid进行产品开发,自己也是初学Angular,就做了一个Demo,实现增删改功能,希望可以帮助大家. 界面如同所示:  数据库一张单表很简单,如图所示:  所有JS代码如下: 1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/xhtml" ng-app="infoApp"> 3 <head> 4 <meta