1. <div
  1. cacModule.controller('CacScriptEditCtrl', CacScriptEditCtrl);
  2. CacScriptEditCtrl.$inject = ['$uibModalInstance', '$scope', '$compile', '$scope', 'cacScriptService', 'messageService', 'entity'];
  3.  
  4. function CacScriptEditCtrl($uibModalInstance, $scope, $compile, $scope, cacScriptService, messageService, entity) {
  5.  
  6. var vm = this;
  7. vm.views = {
  8. script: entity.script,
  9. scriptList: [],
  10. cancel: cancel,
  11. //save: save,
  12. reduceScript: reduceScript,
  13. addScript: addScript,
  14. uploadAttach: uploadAttach,
  15. files: []
  16. };
  17. function cancel() {
  18. $uibModalInstance.close({action: "cancel"});
  19. }
  20. function uploadAttach($file) {
  21.  
  22. vm.views.files = $file;
  23. if($file.length>1){
  24. for(var i=0;i<$file.length;i++){
  25. console.log($file[i]);
  26. }
  27. }
  28. }
  29.  
  30. function reduceScript($index) {
  31.  
  32.        /**这里虽然吧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);就能直接移除
           */
  33. angular.element(".file" + $index).val(null);
  34. //angular.element(".fileDiv"+$index).remove();
  35. vm.views.scriptList.splice($index, 1);
  36. }
  37.  
  38. function addScript() {
  39. initFileInput();
  40. }
  41. var temp = 0;
  42. function initFileInput() {
  43. temp++;
  44. var scriptObj = {
  45. scriptParams: temp
  46. };
  47. vm.views.scriptList.push(scriptObj);
  48. }
  49.  
  50. function init() {
  51. //新增
  52. if (vm.views.script == null) {
  53. initFileInput();
  54. } else {
  55. //编辑
  56. }
  57. }
  58.  
  59. init();
  60.  
  61. }
  1.  
  1. class="form-group fileDiv{{$index}}" ng-repeat="item in cacScriptEditVm.views.scriptList track by $index">
  2. <div class="col-sm-4">
  3. <input type="file" id="file{{$index}}" class="file{{$index}}" ngf-select ngf-change="cacScriptEditVm.views.uploadAttach($files)"/>
  4. </div>
  5. <div class="col-sm-8">
  6. <input type="text" name="file" ng-model="item.scriptParams"/>
  7. <a class="btn btn-info" ng-click="cacScriptEditVm.views.addScript()"><i class="fa fa-plus"></i> </a>
  8. <a class="btn btn-info" ng-click="cacScriptEditVm.views.reduceScript($index)"><i class="fa fa-minus"></i> </a>
  9. </div>
  10. </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没被删除,要么删除了之后,点击事件失效)的更多相关文章

  1. 判断大文件是否上传成功(一个大文件上传到ftp,判断是否上传完成)

    大文件上传ftp,不知道有没有上传完成,如果没有上传完成另一个程序去下载这个文件,导致下载不完整. 判断一个文件是否上传完成的方法: /** * 间隔一段时间去计算文件的长度来判断文件是否写入完成 * ...

  2. php 上传文件实例 上传并下载word文件

    上传界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  3. php学习笔记:文件的上传(包含设置文件的上传大小限制)

    今天写的是文件上传,前几天自学的正规则又忘记了,用了很笨的方法去判断格式,直接上代码: <?php /** * Created by PhpStorm. * User: Administrato ...

  4. SpringMVC下文件的上传与下载以及文件列表的显示

    1.配置好SpringMVC环境-----SpringMVC的HelloWorld快速入门! 导入jar包:commons-fileupload-1.3.1.jar和commons-io-2.4.ja ...

  5. ftp上传文件不能上传到指定的文件夹

    首先是,使用ftp创建连接,这一点没有错误,但是在切换目录创建文件夹的时候出现了问题. 指定创建的文件夹,总是创建失败,切换目录同样失败.最后查看文件夹的权限才知道,没有权限的问题: 然后给img文件 ...

  6. .Net多文件同时上传(Jquery Uploadify)

    前提:领导给了我一个文件夹,里面有4000千多张产品图片,每张图片已产品编号+产品名称命名,要求是让我把4000多张产品图片上传到服务器端,而且要以产品编码创建n个文件夹,每张图片放到对应的文件夹下. ...

  7. 利用Jquery使用HTML5的FormData属性实现对文件的上传

    1.利用Jquery使用HTML5的FormData属性实现对文件的上传 在HTML5以前我们如果需要实现文件上传服务器等功能的时候,有时候我们不得不依赖于FLASH去实现,而在HTML5到来之后,我 ...

  8. plupload 大文件分片上传与PHP分片合并探索

    最近老大分给我了做一个电影cms系统,其中涉及到一个功能,使用七牛云的文件上传功能.七牛javascript skd,使用起来很方便,屏蔽了许多的技术细节.如果只满足与调用sdk,那么可能工作中也就没 ...

  9. Node + js实现大文件分片上传基本原理及实践(一)

    _ 阅读目录 一:什么是分片上传? 二:理解Blob对象中的slice方法对文件进行分割及其他知识点 三. 使用 spark-md5 生成 md5文件 四. 使用koa+js实现大文件分片上传实践 回 ...

随机推荐

  1. mysql 禁制远程连接

    改表法:把host地址改为% use mysql; update user set host = '%' where user = 'root'and host="127.0.0.1&quo ...

  2. 【TP3.2】路由匹配和规则

    TP3.2框架的路由匹配和规则处理: 包括:静态路由,动态路由,多参数路由.正则路由 <?php return array( //'配置项'=>'配置值' /* * 路由开启和匹配.首先开 ...

  3. javascript通用函数库

    /* -------------- 函数检索 -------------- trim函数:                         trim() lTrim() rTrim() 校验字符串是否 ...

  4. Intellij IDEA 使用技巧一

    前言 个人之前一直用eclipse做c++.java开发,换到新公司,大家都用IDEA开发工具,所以最近也在学习,总结下个人心得. 1.文本编辑 删除    ctr + y         复制   ...

  5. MFC总结之CListCtrl用法及技巧(二)

    续第一篇:MFC总结之CListCtrl用法及技巧(一) http://blog.csdn.net/zwgdft/article/details/7560592 本篇重点介绍:禁止拖动表头.让第一列居 ...

  6. 《开源框架那点事儿23》:採用TinyDB组件方式开发

    採用TinyDB组件方式开发 步骤 Icon 前文介绍四则运算的流程编程开发时,说过流程编排在开发反复功能时.能够利用已有的组件库高速开发.对于开发者而言仅仅须要简单配置流程就能够完毕工作了.开发增删 ...

  7. tp数据库操作

    1.常见的数据库操作//插入记录// $insert=Db::execute("insert into tp_user (username,password) values ('dome', ...

  8. django-1.11.3 源码详解 -- 0001 django-admin.py 的调用逻辑

    django-admin是django的命令行接口.可以用它来创建工程(startproject) .创建app(startapp).它里面又是怎么写的呢? 一.django-admin.py 的内容 ...

  9. Object-C中的数字对象

    #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...

  10. ny712 探寻宝藏 ny61 传纸条(1)

    探 寻 宝 藏 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物.某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处 ...