将所有方法绑定到'this'

时间:2014-12-16 13:52:37

标签: javascript knockout.js

我有一个IIFE,其中定义了一些方法,一些是公开的,一些不是。

在很多函数中(包括私有函数)我使用'this'关键字,所以显然为了确保我在正确的上下文中,我需要使用.call(this)方法。有没有办法将IIFE内的所有函数绑定到正确的上下文,而不必使用call()

定义var self=this不是一个选项,因为它弄乱了Knockout上下文。

ko.utils.extend(SingleSelectDropdownViewModel.prototype, (function () {
            var STRINGS = {
                All: l10n('All')
            };
        //Public Functions
        var init = function (params) {

            this.selectedValue = params.selectedValue;
            this.title = ko.observable();

            this.items = params.items;
            this.menuOpen = ko.observable(false);

            //would like to avoid using call and just use _setTitle()
            _setTitle.call(this);
        },

        ...
        //Private Functions
        _setTitle = function(){
            if (ko.unwrap(this.selectedValue)){
                var i = util.index(this.items(),ko.unwrap(this.selectedValue),'id');
                i = i > -1 ? i : 0;
                this.title(this.items()[i].text);
            }
            else {
                this.title(this.items()[0].text);
            }

        },


        _hideMenu = function(){
            this.menuOpen(false);
        },


        ...
        return {
            init: init
        };

    })());

1 个答案:

答案 0 :(得分:1)

我建议您坚持只在函数中使用this,这些函数实际上是对象的方法,并且在其余时间使用函数参数。如果您这样做,您的代码将变为:

ko.utils.extend(SingleSelectDropdownViewModel.prototype, (function () {
    var STRINGS = {
        All: l10n('All')
    };
    //Public Functions
    var init = function (params) {

        this.selectedValue = params.selectedValue;
        this.title = ko.observable();

        this.items = params.items;
        this.menuOpen = ko.observable(false);

        //would like to avoid using call and just use _setTitle()
        _setTitle(this);
    },

    ...
    //Private Functions
    _setTitle = function (obj) {
        if (ko.unwrap(obj.selectedValue)){
            var i = util.index(obj.items(),ko.unwrap(obj.selectedValue),'id');
            i = i > -1 ? i : 0;
            obj.title(obj.items()[i].text);
        }
        else {
            obj.title(obj.items()[0].text);
        }
    },


    _hideMenu = function(obj){
        obj.menuOpen(false);
    },


    ...
    return {
        init: init
    };

})());