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来保证两个元素都会渲染,否则只会渲染一个

原文地址:https://www.cnblogs.com/zml-java/p/9042755.html

时间: 2024-10-14 00:56:19

angularJs 多文件动态上传(删除其中一个文件的时候,要么file没被删除,要么删除了之后,点击事件失效)的相关文章

FTP文件操作 上传文、 下载文件、删除文件 、创建目录

/// <summary> /// FTP上传文件 /// </summary> /// <param name="fileUpload">上传控件</param> /// <param name="ftpServerIP">上传文件服务器IP</param> /// <param name="ftpUserID">服务器用户名</param> ///

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

上传界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Con

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

首先是,使用ftp创建连接,这一点没有错误,但是在切换目录创建文件夹的时候出现了问题. 指定创建的文件夹,总是创建失败,切换目录同样失败.最后查看文件夹的权限才知道,没有权限的问题: 然后给img文件夹下的所有文件,授权: chmod -R 777 /home/img 查看权限: 设置完成. 亲测好使.

web文件上传一学习记录 (简单的web浏览器可读文件的上传,servlet 文件上传)

文件上传:这里用得时表单上传的方式,表单上传到的时候 method一定指定为POST,enctype="multipart/form-data". 第一种方式,直接上传.读取.显示内容,并没有存储到服务器端. 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.g

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

1.利用Jquery使用HTML5的FormData属性实现对文件的上传 在HTML5以前我们如果需要实现文件上传服务器等功能的时候,有时候我们不得不依赖于FLASH去实现,而在HTML5到来之后,我们很容易的实现对文件的上传,只需要利用HTML5的一个FormData属性,结合Jquery就很容易实现文件的上传,而且读取文件的上传进度,下面这个上传案例就是基于上面所说的实现的,下面我将所所有的JS和CSS以及HTML页面代码放在下面. 注意事项:FormData属性必须依赖于HTML5,所以如

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

最近老大分给我了做一个电影cms系统,其中涉及到一个功能,使用七牛云的文件上传功能.七牛javascript skd,使用起来很方便,屏蔽了许多的技术细节.如果只满足与调用sdk,那么可能工作中也就没有什么收获了.其中对七牛云的服务很佩服的一点是,无论我上传多大的文件,当我文件最后一片上传完成的时候,就立刻返回到文件链接,这个问题我想了好久,也不知道七牛是如何做到的. 七牛云的sdk分为 JavaScript 与 PHP端. JavaScript端的作用是提供文件上传功能,客户端(浏览器)无需关

struts2_10_单个文件的上传:

向lib下导入jar文件:commons-io-1.3.2.jar:该jar文件包含FileUtils类. 1)employeeAction中的代码为: public class employeeAction { // 要上传的文件 private File image; // 上传文件的文件名称,image为上传字段的名称,FileName为固定字段 private String imageFileName; public String getImageFileName() { return

文件断点上传,html5实现前端,java实现服务器

断点上传能够防止意外情况导致上传一半的文件下次上传时还要从头下载,网上有很多关于断点的实现,这篇文章只是从前到后完整的记录下一个可用的实例,由于生产环境要求不高,而且就是提供给一两个人用,所以我简化了诸多过程,不用flash,也不用applet,只是通过html5的新特性进行浏览器端的处理. 简单说下关键点 如果上次传到n字节,那么浏览器下次续传直接就是从文件的n字节开始向服务器传送数据,而不是都传过去,服务器从n字节开始接收. html5能给文件分片,所以每次上传完一块文件后,应该返回当前已经

nginx由于权限导致大文件不能上传的问题

1.用了nginx代理后,应用上传文件时,发现小文件可上传,大文件上传不了,查nginx日志,发现有这么一句:client intended to send too large body 在nginx.conf配置文件的server加上 client_max_body_size 1024m; 重启nginx,上传大文件,还是上传不了,但后台没有client intended to send too large body日志了. 此时后台有日志如:2019/08/02 18:37:35 [crit