如何保持这个'嵌套函数中的上下文

时间:2017-11-29 22:54:55

标签: javascript ractivejs

我需要在内部函数oninit中访问我的对象原型函数。下面的代码确实有效,但我需要的是在init函数中使用与self相同的上下文,这样我就可以像this.loadData一样调用原型函数。

请协助。

define([
    'require',
    'lodash-compat',
    'BaseWidget'
],
function (require, _, BaseWidget) {

    var Widget = function (options) {
        this.set('url', '/some/endpoint/url');  
        var self = this;


        _.assign(options, {
            oninit: function () {
                self.loadData.call(this);
            },
            oncomplete: function () {
                //do something here
            }
        });
        self.ractive = new BaseWidget(options);
    };

    Widget.prototype = {
        loadData: function () {
            var url = this.get('url');
            // my async request
        }
    };

    return {
        initRactiveWidget: function (options) {
            return new Widget(options);
        }
    };

});

2 个答案:

答案 0 :(得分:0)

尝试直接将this绑定到该函数。有关此https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

的更多信息
oninit: function () {
    this.loadData();
}.bind(this)

答案 1 :(得分:0)

由于您已使用变量self,因此系统会使用loadData的预期值调用this

oninit: function () {
    self.loadData();
}

简化示例:请注意loadData正确打印this.name



var Widget = function() {
    var self = this;

    this.name  = "Christian";

    setTimeout(function() {
        self.loadData();
    }, 500);
}

Widget.prototype = {
    loadData : function() {
        console.log(this.name);
    }
};

var w = new Widget();