1

私はwidget-factoryパターンを使用してjquery-uiプラグインを作成することを学んでいます。よりクリーンな編成のために、に渡されるオブジェクトリテラル内にいくつかのヘルパーメソッドを定義しています $.widget。それらのヘルパーのオプションオブジェクトにアクセスしたいと思います。たとえば、以下のボイラープレートで、内部のオプションオブジェクトにアクセスするにはどうすればよい_helper()ですか?

;(function ( $, window, document, undefined ) {

    $.widget( "namespace.widgetName" , {

        options: {
            someValue: null
        },

        _create: function () {
            // initialize something....
        },

        destroy: function () {

            $.Widget.prototype.destroy.call(this);
        },

        _helper: function () {
            // I want to access options here.
            // "this" points to the dom element, 
            // not this object literal, therefore this.options wont work
            console.log('methodB called');
        },

        _setOption: function ( key, value ) {
            switch (key) {
            case "someValue":
                //this.options.someValue = doSomethingWith( value );
                break;
            default:
                //this.options[ key ] = value;
                break;
            }
            $.Widget.prototype._setOption.apply( this, arguments );
        }
    });

})( jQuery, window, document );

ありがとうございました。

4

1 に答える 1

1

だからあなたはあなたの中でこれをやっています_create

$(some_selector).click(this._helper)

this_helperthison にしたいthis._helper(つまり、ウィジェット)。

さまざまな解決策があります。

  1. あなたが使用することができます$.proxy

    $(some_selector).click($.bind(this._helper, this));
    

    アンダースコアもあり、 JavaScript のバージョンの問題を気にする必要がない場合は_.bindネイティブがあります)。Function.bind他のライブラリには、独自の関数バインディング ツールがあります。すでに jQuery を使用しているため$.proxy、すでに使用可能で移植可能です。

  2. 標準のvar _this = this;トリック プロキシを使用して_helper自分で呼び出すことができます。

    var _this = this;
    $(some_selector).click(function() { _this._helper() });
    
  3. eventData次の形式をclick使用できます。

    $(some_selector).click({ self: this }, this._helper);
    

    そして次に_helper

    _helper: function(ev) {
        var self = ev.data.self;
        // 'self' is the 'this' you're looking for.
        ...
    }
    
于 2012-08-12T19:19:23.747 に答える