给出以下代码:
<input data-bind="event: { change: uploadImage(this.files[0]) }" style="width: 10px;" type="file">
我收到错误消息“文件未定义”。我正在尝试转换此演示:
https://github.com/paulrouget/miniuploader/blob/gh-pages/index.html
对淘汰赛友好的实施。加载页面时发生错误。知道如何访问该文件,如果用户指定的话?
jsfiddle:http://jsfiddle.net/LkqTU/9597/
答案 0 :(得分:41)
你有两个问题:
如果您只是在对象文字中编写函数调用(uploadImage(this.files[0])
),则在初始化对象文字时将执行一次,以便在KO解析绑定时。因此,它将使用错误的参数执行一次,并且您更改事件将不起作用。您可以将其包装到匿名函数中。请参阅文档Accessing the event object, or passing more parameters section.
this
未引用您需要使用的约束中的当前元素$element
instead.
所以正确的绑定看起来像这样:
data-bind="event: { change: function() { uploadImage($element.files[0]) } }"
演示JSFiddle。
答案 1 :(得分:14)
对于任何感兴趣的人,您可以使用以下自定义绑定,它允许将文件输入元素绑定到包含File的挖空可观察对象。
它处理将observable设置为所选文件(由@nemesv回答),以及当observable设置为null时清除input元素(参见this answer):
ko.bindingHandlers.fileUpload = {
init: function (element, valueAccessor) {
$(element).change(function () {
valueAccessor()(element.files[0]);
});
},
update: function (element, valueAccessor) {
if (ko.unwrap(valueAccessor()) === null) {
$(element).wrap('<form>').closest('form').get(0).reset();
$(element).unwrap();
}
}
};
function Example() {
var self = this;
self.uploadFile = ko.observable(null);
self.uploadName = ko.computed(function() {
return !!self.uploadFile() ? self.uploadFile().name : '-';
});
self.clear = function() {
self.uploadFile(null);
};
};
ko.bindingHandlers.fileUpload = {
init: function(element, valueAccessor) {
$(element).change(function() {
valueAccessor()(element.files[0]);
});
},
update: function(element, valueAccessor) {
if (ko.unwrap(valueAccessor()) === null) {
$(element).wrap('<form>').closest('form').get(0).reset();
$(element).unwrap();
}
}
};
ko.applyBindings(new Example());
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<input type="file" data-bind="fileUpload: uploadFile">
<br/>
<br/>Selected file name: <span data-bind="text: uploadName"></span>
<br/>
<button data-bind="click: clear">Clear input</button>
&#13;
答案 2 :(得分:0)
可能这个是最简单的了,上传前也能看到图片的预览
<input type="file" data-bind="fileSrc: src" id="file"/>
<img data-bind="attr:{src:src}"/>
$(function() {
ko.applyBindings(new ViewModel());
});
var ViewModel = function () {
var self = this;
self.src = ko.observable();
};
ko.bindingHandlers.fileSrc = {
init: function (element, valueAccessor) {
ko.utils.registerEventHandler(element, "change", function () {
var reader = new FileReader();
reader.onload = function (e) {
var value = valueAccessor();
value(e.target.result);
}
reader.readAsDataURL(element.files[0]);
});
}
};