问题1: 在使用angularJs情况下, 使用input标签 配合 ng-change 无效,为什么原生的 input的onchange事件有效?
问题2: 使用input标签 文件上传svg之后,然后再上传用同一个svg文件,没有任何反应?
问题1:
原因:首先 ng-change事件要与ng-model绑定,但是在input type类型为file的时候ng-change是无效
,所以我们可以这样写
<input type="file" class="inputBtn" accept="image/svg+xml" onchange="angular.element(this).scope().vm.inputChange(files)">
vm.inputChange = function (files) {
var file = files[0];
if (!file) {
throw new Error("Failed to get file");
}
//创建读取文件对象
var reader = new FileReader();
//将文件读取为文本格式
reader.readAsText(file);
reader.onload = function (e) {
console.log(e.target.result);
}
}
还是要用原生的onchange事件,然后取到input元素的scope对象,再把方法绑到vm控制器上
问题2:
原因:文件上传通过onchange触发,第一次上传会有个value值,第二次上传后,会和之前的value值进行对比,相同的话就不会触发onchange,下面有两种方法可以解决这个问题!
方法1:每次点击的时候去清空input value值
vm.click = function (event) {
event.target.value = "";
}
方法2:点击的时候把type类型设置为"file",当上传完成后把type类型设置为"text"
//点击的时候设置为file类型
vm.click = function (event) {
$(event.target).attr("type", "file")
}
vm.inputChange = function (event, files) {
console.log(event, files)
var file = files[0];
if (!file) {
throw new Error("Failed to get file");
}
//创建读取文件对象
var reader = new FileReader();
//将文件读取为文本格式
reader.readAsText(file);
reader.onload = function (e) {
//拿到文件后把input设置成text类型
$(event.target).attr("type", "text")
console.log(e.target.result);
}
}