3.2.1 配置构建Angular应用——简单的笔记存储应用——编辑功能
本节我们会接着上节课的内容,继续来完成使用Angular来创建简单的笔记存储应用,上一节课,我们完成了笔记的展示功能,本节课,我们来完成编辑功能。
编辑主要是两个功能:编辑现有的笔记以及创建新笔记。首先我们需要让应用第一次启动或用户点击"添加"按钮时创建一个新笔记。
3.2.9 添加笔记功能
首先我们需要给表单添加一些模型,这样可以用表单来控制数据更新,同时,你还需要让编辑器右侧显示一个实时预览笔记效果的界面,因此需要添加一个Markdown指令,打开index.html文件,进行如下修改:
<div class="panel-heading">
<!-- 把title模型关联到输入框 -->
<h3 class="panel-title"><input type="text" class="form-control" ng-model="content.title" placeholder="New Note" required /></h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-sm-6">
<h3>Editor</h3>
<!-- 把content模型关联到文本输入框 -->
<textarea class="form-control editor" rows="10" ng-model="content.content" placeholder="Note Content" required></textarea>
</div>
<div class="col-sm-6">
<h3>Preview</h3>
<!-- 使用markdown命令来预览内容 -->
<div class="preview" markdown="{{content.content}}"></div>
</div>
</div>
</div>
这里使用ngModel来把模型的值关联到输入框和文本框上,用户做任何改动都会立刻反应到content模型。修改完成后,刷新页面,在编辑面板输入内容,在预览面板即可看见。下面我们来实现点击"添加"按钮,创建新笔记的功能。要实现这个功能,我们需要给"添加"按钮绑上一个click事件,进入index.html文件:
<div class="panel-heading">
//给"添加"按钮添加click事件
<h3 class="panel-title"><button class="btn btn-primary btn-xs pull-right" ng-click="create()">添加</button>我的笔记</h3>
</div>
然后更新"编辑"按钮,也是进入index.html文件:
<h3 class="panel-title">{{content.title}} <button class="btn btn-primary btn-xs pull-right" ng-click="editing=true">编辑</button></h3>
"添加"按钮会调用控制器的create()方法(我们后面写),"编辑"按钮不会调用方法,但会改变编辑模式。
下面我们来定义create()方法,进入editor.js文件,编辑控制器:
$scope.create = function(){ //创建create方法并把它赋值给作用域,这样就可以在模版的ngClick中调用
$scope.editing = true; //确保editing状态为true
$scope.content = { //使用空值重置content模型
title:'',
content:''
};
};
此时,我们单击"添加"按钮,会触发create()方法,它会把editing模型改为true,并把content模型重置为一个空笔记。
3.2.10 保存笔记的功能
下面我们给"保存"按钮添加一个save()方法,来保存笔记。保存笔记需要使用$http服务来把笔记发送到服务。这个服务会使用POST方法来创建一个新笔记病用PUT方法来更新笔记。$http.post()和$http.put()都可以接受第二个参数,它是发送到服务的数据。除此之外使用方法和$http.get()一样。
保存笔记前,先要确定笔记是否有存在,就需要判断内容是否有id,新笔记在保存之前是没有id的,如果id存在,就更新笔记,如果不存在,就创建新笔记。进入editor.js文件,创建save控制器方法:
$scope.save = function(){ //把save()方法赋值给作用域
$scope.content.date = new Date(); //把日期设置成这个笔记最后一次被编辑的日期
if($scope.content.id){ //检查这个笔记是否有ID,从而判断是该更新已有笔记还是创建新笔记
$http.put('/notes/' + $scope.content.id, $scope.content).success(function(data){ //向笔记API发送PUT请求来更新笔记并在完成之后关闭编辑模式
$scope.editing = false;
});
}else{
$scope.content.id = Date.now(); //因为这是一个新笔记,基于当前时间给它一个独一无二的ID
$http.post('/notes', $scope.content).success(function (data) { //向笔记API发送POST请求来创建一个新笔记,然后把新笔记加入笔记列表,最后关闭编辑模式
$scope.notes.push($scope.content);
$scope.editing = false;
})
}
};
save()方法首先用当前的时间戳更新日期,以保存最后一次保存的时间。然后检查ID是否存在,并据此来决定发送post或者put请求。这两个请求都会关闭编辑模式,进入笔记展示模式。
在保存笔记之前,我们可以使用Angular内置的表单特性来验证内容并在验证失败时禁用"保存"按钮。你需要在表单有效的时候显示"保存"按钮并给它添加click事件。进入index.html文件,对"保存"按钮做如下修改:
<button class="btn btn-primary" ng-click="save()" ng-disabled="editor.$invalid">保存</button>
ngClick会调用save()方法并保存笔记,但如果editor.$invalid为true,那ngClick将不会被触发。
3.2.11 删除笔记的功能
删除笔记首先我们要给"删除"按钮添加一个remove()方法,它会调用服务器来删除笔记并把它从应用中删除。进入editor.js文件,添加remove()方法到控制器中:
$scope.remove = function(){ //声明remove()方法
$http.delete('/notes/' + $scope.content.id).success(function(data){ //向笔记API发送删除请求
var found = -1;
angular.forEach($scope.notes, function(note,index){ //遍历笔记数组找到要删除的笔记下标
if(note.id === $scope.content.id){
found = index;
}
});
if(found>=0){ //如果找到笔记,从angular应用的笔记列表中删除
$scope.notes.splice(found,1);
}
$scope.content = { //重置content模型,为下一个新笔记做准备
title:'',
content:''
};
});
};
remove()方法基于笔记的ID给笔记服务发送http delete请求,然后在收到http响应时从控制器的notes数组删除笔记。为了从notes模型删除笔记,我们需要编辑所有的笔记,判断ID是否与被删除的笔记ID一样,如果一样,删除笔记,同时重置content模型,为下一条笔记做准备。
最后我们来给"删除"按钮添加ngClick事件,来调用remove()方法。此时需要用ngIf来有条件的现实"删除"按钮,只在编辑现有笔记的时候才显示,因为不能删除一个还没有保存的笔记。进入index.html文件,做如下修改:
<button class="btn btn-danger pull-right" ng-click="remove()" ng-if="content.id">删除</button>
现在编辑现有笔记的时候,就可以调用remove()方法来删除笔记了。
3.2.1 配置构建Angular应用——简单的笔记存储应用——编辑功能的更多相关文章
- 3.2.1 配置构建Angular应用——简单的笔记存储应用——展示功能
本节我们会通过构建一个简单的笔记存储应用(可以载入并修改一组简单的笔记)来学习如何应用Angular的特性.这个应用用到的特性有: 在JSON文件中存储笔记 展示.创建.修改和删除笔记 在笔记中使用M ...
- 3.2 配置构建Angular应用——简单的笔记存储应用
本节我们会通过构建一个简单的笔记存储应用(可以载入并修改一组简单的笔记)来学习如何应用Angular的特性.这个应用用到的特性有: 在JSON文件中存储笔记 展示.创建.修改和删除笔记 在笔记中使用M ...
- android studio+grade配置构建
Android 构建系统编译应用资源和源代码,然后将它们打包成可供您测试.部署.签署和分发的 APK.android Studio 使用 Gradle 这一高级构建工具包来自动化执行和管理构建流程,同 ...
- jenkins配置构建执行状态
运行构建 在项目 左侧列表点击 “立即构建” ,在 “Build History” 列表中,会看到执行状态,蓝色圆点表示构建成功,红色圆点表示构建失败 点击 构建失败的任务(红色的小圆点).然后点击“ ...
- C# 构建XML(简单示例)
C# 构建XML的简单示例: var pars = new Dictionary<string, string> { {"url","https://www. ...
- Redis:安装、配置、操作和简单代码实例(C语言Client端)
Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...
- win2008系统:iis配置备份和还原简单操作
(2013-09-26 16:33:22) 转载▼ 分类: 开发类 当我们电脑系统有大量的站点和虚拟目录的时候,电脑因为种种原因需要重做系统,那么重装系统后这些站点我们是否只能一个一个的添加,如果 ...
- Ubuntu下配置python完成爬虫任务(笔记一)
Ubuntu下配置python完成爬虫任务(笔记一) 目标: 作为一个.NET汪,是时候去学习一下Linux下的操作了.为此选择了python来边学习Linux,边学python,熟能生巧嘛. 前期目 ...
- Log4j简单学习笔记
log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...
随机推荐
- 【简●解】[ZJOI2005]午餐
[简●解][ZJOI2005]午餐 [关键词] \(DP\) 排序/贪心 [分析] 首先,一个很明显的贪心思路,就是吃的慢的人先打饭.所以把数据按吃饭时间从大到小排一遍序. 根据\(dp\)的尿性,比 ...
- sql语句执行顺序与性能优化(1)
一.首先我们看一下mysql的sql语句的书写顺序 . select--distinct--from--on--where--group by--having--聚合函数cube.rollup--or ...
- MVC常见框架
Struts Struts是Apache软件基金下Jakarta项目的一部分.Struts框架的主要架构设计和开发者是Craig R.McClanahan.Struts 是Java Web MVC框架 ...
- 小白安装Python环境详细步骤!
昨天,有小伙伴向我反映,他对我说“你好像还没教过我安装Python的吧?”听到这句话,我不禁汗颜起来,我的确好像没太注意Python学习的基础了,一直发各种爬虫与初学者看不懂的代码,在此我要向我的读者 ...
- 【HIHOCODER 1043】题目1 : 完全背包
描述 且说之前的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 等等,这段故事为何似曾相识?这就要从平行宇宙理论说起了---总而言之,在另一个宇宙中,小 ...
- python接口自动化-发xml格式post请求
前言 post请求相对于get请求多一个body部分,body部分常见的数据类型有以下四种(注意是常见的,并不是只有4种) application/x-www-form-urlencoded appl ...
- zoj 2850 Beautiful Meadow
Beautiful Meadow Time Limit: 2 Seconds Memory Limit: 65536 KB Tom's Meadow Tom has a meadow in ...
- Laya Tween 和 遮罩
Laya Tween 和 遮罩 @author ixenos 场景:在使用Tween循环时,不规则物体部分超出范围 方案:使用遮罩定型 困境:在laya ide设计模式中将遮罩sprite放到不规则物 ...
- kubernetes集群新增node
kubernetes集群要新增node,首先要配置ssh免密登陆 root@ht:/etc/ansible# ssh-copy-id 172.18.196.6 /usr/bin/ssh-copy-id ...
- 解决Genymotion运行Android 5.0一直卡在开机界面
在一些机器,启动genymotion 的android5.0版模拟器时,会卡在启动界面,一直启动不了. 这是因为要求的开启虚拟选项没有打开,在第一次启动时,会有提示,但可能大家没有注意(我也没注意到, ...