knockout.js 如何访问文件输入与挖空绑定?

bkkx9g8r  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(124)

给定以下代码:

<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/的参数

lvjbypge

lvjbypge1#

你有两个问题:

  • 如果你只是在一个对象文字内写一个函数调用(uploadImage(this.files[0])),当对象文字被初始化时,它会被执行一次,所以当KO解析绑定时。所以它会被错误的参数执行一次,你改变的事件将不起作用。你可以通过将它 Package 到一个匿名函数中来使它起作用。请参见文档Accessing the event object, or passing more parameters section.
  • this没有引用绑定中的当前元素,您需要使用$element instead.

因此,正确的绑定如下所示:

data-bind="event: { change: function() { uploadImage($element.files[0]) } }"

演示JSFiddle

cs7cruho

cs7cruho2#

对于任何感兴趣的人,您可以使用以下自定义绑定,它允许将文件输入元素绑定到包含File的knockout可观察对象。
它处理将可观察值设置为选定的文件(由@nemesv回答),以及在可观察值被设置为空时清除输入元素(参见this回答):

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();
        }
    }
};

示例:

第一个

fwzugrvs

fwzugrvs3#

可能这是最简单的一个,你也可以看到图片上传前的预览

<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]);
        });
    }
};

相关问题