if数据绑定和文件上传的行为非常奇怪
Very strange behavior with if data-bind and file upload
我注意到在一个我使用敲除功能的页面上发生了一些非常奇怪的事情。情况如下:
<div class="col-md-4">
<h3 class="">Upload Document</h3>
<form id="document-form">
<span class="form-group">
<input type="file" name="files" value="Upload" multiple="" id="input-file" style="display: none;" data-bind="event:{change: uploadFiles}" />
<label for="input-file" class="btn btn-default">Select Files</label>
</span>
</form>
</div>
每当用户添加文件时,这个小区域就会立即将文件发布回我的服务器。uploadFiles的代码如下所示。
//formNode is passed into the viewmodel at time of instantiation, and it is just
//the DOM node that represents that <form></form> element
self.uploadFiles = function() {
self.showLoading(true);
event.preventDefault();
var formData = new FormData($(formNode)[0]);
$.ajax({
url: someUrl,
type: 'POST',
data: formData,
async: true,
cache: false,
contentType: false,
processData: false,
success: someFunction
});
};
所以这非常有效。然后,我添加了一个if数据绑定到整个事情上,就像这样:
<div class="col-md-4" data-bind="if: userHasPermission">
<h3 class="">Upload Document</h3>
<form id="document-form">
<span class="form-group">
<input type="file" name="files" value="Upload" multiple="" id="input-file" style="display: none;" data-bind="event:{change: uploadFiles}" />
<label for="input-file" class="btn btn-default">Select Files</label>
</span>
</form>
</div>
现在,用户(假设他们有权限)可以看到上传表单,也可以选择要上传的文件,但uploadFiles函数现在在formData变量中没有具体化任何内容,因此,除了一个空的、没有名称的文件外,什么都不会发回服务器。
你知道为什么会这样吗?我能做些什么来缓解这种情况吗?
问题是使用if:binding时,formNode在"实例化"时不存在。在userHasPermission为true之前,if:binding块中的html不会通过敲除生成。如果userHasPermission更改为false,则HTML将从DOM中删除。
有了可见的绑定,html就在那里,只是隐藏起来了。
因此,为了解决这个问题,您可以继续使用注释中提到的可见绑定,也可以简单地更改上传文件功能,每次都获得DOM元素:
var formData = new FormData($('#document-form')[0]);
或者不管表单ID是什么。
尽管你已经解决了它,但仔细想想吧。但是if绑定从物理上删除了元素。因此,您在实例化时传递的表单元素已不存在。
相关文章:
- 在VanillaJS中模拟模型双向数据绑定
- Telerik rad组合框多列数据绑定
- 数据绑定:'系统Char'不包含名为'xxxxx'
- OnsenUI AngularJS数据绑定无法正常工作
- Ionic-item在导航栏中进行双向数据绑定
- 基本D3.js:如何将具有其他属性的数据绑定到元素
- 使用自定义数据属性或将数据绑定到处理程序来处理事件
- ListView的ItemTemplate内的自定义HtmlControl的数据绑定失败
- $http中的Angular 1数据绑定承诺不起作用
- 在何处和何时添加具有数据绑定的元素
- 使用AngularJs数据绑定的三元运算符显示图像
- 为什么针对工厂的Angular数据绑定只适用于函数
- 敲除:如何使用可见数据绑定可见来隐藏段落标记
- 在数据绑定中使用对象敲除绑定
- 如何在angularjs中检查Kendo树视图数据绑定事件
- 将json数据绑定到剑道网格
- AngularJS数据绑定中断ngRepeat+奇怪行为
- JavaScript HTMLElement 属性上的数据绑定 在 Polymer 中
- 视窗 8/Metro UI 数据绑定 JavaScript
- if数据绑定和文件上传的行为非常奇怪