angularJs 多文件动态上传(删除其中一个文件的时候,要么file没被删除,要么删除了之后,点击事件失效)
<div
cacModule.controller('CacScriptEditCtrl', CacScriptEditCtrl);
CacScriptEditCtrl.$inject = ['$uibModalInstance', '$scope', '$compile', '$scope', 'cacScriptService', 'messageService', 'entity'];
function CacScriptEditCtrl($uibModalInstance, $scope, $compile, $scope, cacScriptService, messageService, entity) {
var vm = this;
vm.views = {
script: entity.script,
scriptList: [],
cancel: cancel,
//save: save,
reduceScript: reduceScript,
addScript: addScript,
uploadAttach: uploadAttach,
files: []
};
function cancel() {
$uibModalInstance.close({action: "cancel"});
}
function uploadAttach($file) {
vm.views.files = $file;
if($file.length>1){
for(var i=0;i<$file.length;i++){
console.log($file[i]);
}
}
}
function reduceScript($index) {
/**这里虽然吧type=file(选了文件之后)置为了null,但是执行完vm.views.scriptList.splice($index,1);之后只要是class="file{{$index}}"(之前移除掉的那个$index)的file都会为空
*主要原因就使我在ng-repeate那里使用了track by $index,自行百度track by $index
*如果我不用angular.element(".file"+$index).val(null);这句去置空,而是使用remove直接移除dom(angula.element(".fileDiv"+$index).remove;)
*会导致angular.element(".fileDiv"+$index)元素的点击事件失效(之前移除掉的那个$index),因为用了remove,它已经脱离这个页面了(这里理解有点难),其原因也是因为用了track by $index;
*如果不用track by $index的话,直接使用vm.views.sriptList.splice($index,1);就能直接移除
*/
angular.element(".file" + $index).val(null);
//angular.element(".fileDiv"+$index).remove();
vm.views.scriptList.splice($index, 1);
}
function addScript() {
initFileInput();
}
var temp = 0;
function initFileInput() {
temp++;
var scriptObj = {
scriptParams: temp
};
vm.views.scriptList.push(scriptObj);
}
function init() {
//新增
if (vm.views.script == null) {
initFileInput();
} else {
//编辑
}
}
init();
}
class="form-group fileDiv{{$index}}" ng-repeat="item in cacScriptEditVm.views.scriptList track by $index">
<div class="col-sm-4">
<input type="file" id="file{{$index}}" class="file{{$index}}" ngf-select ngf-change="cacScriptEditVm.views.uploadAttach($files)"/>
</div>
<div class="col-sm-8">
<input type="text" name="file" ng-model="item.scriptParams"/>
<a class="btn btn-info" ng-click="cacScriptEditVm.views.addScript()"><i class="fa fa-plus"></i> </a>
<a class="btn btn-info" ng-click="cacScriptEditVm.views.reduceScript($index)"><i class="fa fa-minus"></i> </a>
</div>
</div>
总结
track by是angular1.2后新加入的。ng-repeat会为每一次元素加上一个hashkey $$hashKey来识别每一个元素,当我们从后端重新获取数据时,即使数据完全一样,但是由于hashKey不一样,angular会删除之前的所有dom,重新生成新的dom。这样效率就会大大降低。可以理解为ng-repeat默认是 track by $$hashKey的。所以,我们应该使用一些不会变的东西来作为标识,比如后端数据的id.
这样当重新获取数据时,由于id没有变,angular就不会去删除原来的dom,只会更新其中的内容,不同的id再添加新的dom。效率就能提升了。这相当于react中data-reactid的功能,这样angular并不比react慢。
特别说明:
1.track by 一定要放在orderBy之后,否则会影响orderBy的效果;
2.当单一数组如["a","a"]有重复元素时,需要使用track by $index来保证两个元素都会渲染,否则只会渲染一个
angularJs 多文件动态上传(删除其中一个文件的时候,要么file没被删除,要么删除了之后,点击事件失效)的更多相关文章
- 判断大文件是否上传成功(一个大文件上传到ftp,判断是否上传完成)
大文件上传ftp,不知道有没有上传完成,如果没有上传完成另一个程序去下载这个文件,导致下载不完整. 判断一个文件是否上传完成的方法: /** * 间隔一段时间去计算文件的长度来判断文件是否写入完成 * ...
- php 上传文件实例 上传并下载word文件
上传界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- php学习笔记:文件的上传(包含设置文件的上传大小限制)
今天写的是文件上传,前几天自学的正规则又忘记了,用了很笨的方法去判断格式,直接上代码: <?php /** * Created by PhpStorm. * User: Administrato ...
- SpringMVC下文件的上传与下载以及文件列表的显示
1.配置好SpringMVC环境-----SpringMVC的HelloWorld快速入门! 导入jar包:commons-fileupload-1.3.1.jar和commons-io-2.4.ja ...
- ftp上传文件不能上传到指定的文件夹
首先是,使用ftp创建连接,这一点没有错误,但是在切换目录创建文件夹的时候出现了问题. 指定创建的文件夹,总是创建失败,切换目录同样失败.最后查看文件夹的权限才知道,没有权限的问题: 然后给img文件 ...
- .Net多文件同时上传(Jquery Uploadify)
前提:领导给了我一个文件夹,里面有4000千多张产品图片,每张图片已产品编号+产品名称命名,要求是让我把4000多张产品图片上传到服务器端,而且要以产品编码创建n个文件夹,每张图片放到对应的文件夹下. ...
- 利用Jquery使用HTML5的FormData属性实现对文件的上传
1.利用Jquery使用HTML5的FormData属性实现对文件的上传 在HTML5以前我们如果需要实现文件上传服务器等功能的时候,有时候我们不得不依赖于FLASH去实现,而在HTML5到来之后,我 ...
- plupload 大文件分片上传与PHP分片合并探索
最近老大分给我了做一个电影cms系统,其中涉及到一个功能,使用七牛云的文件上传功能.七牛javascript skd,使用起来很方便,屏蔽了许多的技术细节.如果只满足与调用sdk,那么可能工作中也就没 ...
- Node + js实现大文件分片上传基本原理及实践(一)
_ 阅读目录 一:什么是分片上传? 二:理解Blob对象中的slice方法对文件进行分割及其他知识点 三. 使用 spark-md5 生成 md5文件 四. 使用koa+js实现大文件分片上传实践 回 ...
随机推荐
- chrome插件下载
chrome插件下载2018 CreateTime--2018年3月5日11:21:21 Author:Marydon 插件推荐 如何获取? 文章顶部左上角是我的qq号,这些chrome插件加我免 ...
- ubuntu修改默认系统启动项
sudo gedit /etc/default/grub 文件中有一段: GRUB_DEFAULT= 0代表默认从第一项启动 1代表从第二项启动 依次类推 将数字改成你想要启动的 修改完保存关闭,然后 ...
- DBCP( 二) DataBase Connection Pool 的使用
使用DBCP必须用的三个包: commons-dbcp-1.2.1.jar, commons-pool-1.2.jar, commons-collections-3.1.jar. 配置参数. Java ...
- linux内核学习推荐书籍
<UNIX环境高级编程>,推荐指数:★★★★★ <UNIX环境高级编程>是 Unix/ Linux 程序员案头必备的一本书籍.可以说,Linux 程序员如果没有读过这本书,就好 ...
- 基于SSM + Redis的Shiro权限管理项目
概述 本教程结合SSM(SpringMVC + Mybatis)框架讲解Shiro,讲解的内容有自定义shiro拦截器,Shiro Freemarker标签,Shiro JSP标签,权限控制讲解. 详 ...
- MySQL —— 如何快速对比数据?
我们在MySql中想要对比下两个不同的实例上的数据并且找出差异,除了主键之外我们还要对比每一个字段,应该怎么做呢? 方案一:写一个程序将两个实例里面的每一行数据都分别取出来对比,但是耗时我们无法估计, ...
- Python --标准库 存储对象 (pickle包,cPickle包)
在之前对Python对象的介绍中 (面向对象的基本概念,面向对象的进一步拓展),我提到过Python“一切皆对象”的哲学,在Python中,无论是变量还是函数,都是一个对象.当Python运行时,对象 ...
- SQL面试题与附解收集(一)
数据库三范式是什么? 答: 1NF:字段不可分; 2NF:有主键,非主键字段依赖主键; 3NF:非主键字段不能相互依赖; 解释: 1NF:原子性 字段不可再分,否则就不是关系数据库; 2NF:唯一性 ...
- vim中不同模式的帮助信息的查找
vim的模式有多种,比如normal(普通模式),insert(插入模式),command(命令行模式),visual(可视化模式).相同的命令和快捷键在不同的模式下功能是不一样的,因此帮助信息也是分 ...
- [na]tcp的可靠性