【问题标题】:VueJS - Assigning value to this.property within callbackVueJS - 在回调中为 this.property 赋值
【发布时间】:2018-08-17 09:30:09
【问题描述】:

如何强制

this.json = reader.result;

在给定的范围内正确地为 this.json 赋值?

因为值存在,但没有赋值。

<div id="app" >
    <label class="text-reader"><input type="file" v-on:change="getFile($event)"></label>
    {{ json }} // it's being set to "test" from getFile function.
</div>

这是 VueJS 代码


new Vue
({
    el: '#app',
    data: {
        json: {}
    },
    methods:
    {
        getFile: function(ev) 
        {
            this.json = "test";

            var file = ev.target.files[0];
            var reader = new FileReader();
            reader.onload = function(e) 
            {
                this.json = reader.result;
                console.log(this.json);  // displays content properly
            }

            reader.readAsText(file);     
        }
    }
});

到目前为止我一直在尝试的只是添加某种处理程序

getFile: function(ev) 
{
    var file = ev.target.files[0];
    var reader = new FileReader();
    reader.onload = function(e) 
    {
        this.callBackHandler(reader.result);
    }

    reader.readAsText(file);
},
callBackHandler: function(val)
{
    console.log(val);
    this.json = val;
}

它大叫:

TypeError: this.callBackHandler 不是函数


同样使用 callBackHandler 作为参数。

<label class="text-reader"><input type="file" v-on:change="getFile($event, callBackHandler())"></label>

getFile: function(ev, handler) 
{
    var file = ev.target.files[0];
    var reader = new FileReader();
    reader.onload = function(handler) 
    {
        handler(reader.result);
    }

    reader.readAsText(file);
},
callBackHandler: function(val)
{
    console.log(val);
    this.json = val;
}

【问题讨论】:

  • 使用箭头函数或将this绑定到你的reader.onload函数;或者这样:声明 let self = this;在 getFile 方法中,然后在 reader.onload 中使用 self.callBackHandler()
  • @ElDanielo 请把它写成答案,它有效。 reader.onload = (x => { this.callBackHandler(reader.result); });

标签: javascript vue.js vuejs2 frontend


【解决方案1】:

getFile 函数应如下所示:

getFile: function(ev, handler) {
        var file = ev.target.files[0];
        var reader = new FileReader();
        reader.onload = (e => {
            this.callBackHandler(reader.result);
        }) 
}

getFile: function(ev, handler) {
        var file = ev.target.files[0];
        var reader = new FileReader();
        var self = this;
        reader.onload = function(e){
            self.callBackHandler(reader.result);
        } 
}

getFile: function(ev, handler) {
        var file = ev.target.files[0];
        var reader = new FileReader();
        reader.onload = function(e){
            this.callBackHandler(reader.result);
        }.bind(this) 
}

【讨论】:

    【解决方案2】:

    解决方案:

    v-on:change="getFile($event)"
    
    (...)
    
    reader.onload = (x => 
    {
        this.callBackHandler(reader.result);
    });
    

    【讨论】:

    • 虽然这段代码可以回答这个问题,但它缺乏解释。请考虑添加文字来解释它的作用,以及它为什么回答所提出的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2020-08-24
    • 2021-08-23
    • 1970-01-01
    • 2020-07-21
    • 2013-05-27
    • 1970-01-01
    相关资源
    最近更新 更多