3

あるメソッドからサブシーケンスメソッドにデフォルトオプションを渡すにはどうすればよいですか?

たとえば、メソッドにはデフォルト設定があります。initこれらの設定を、、などの他の方法に使用したいと思いますshow

(function($) {
    var methods = {
        init: function(options) {
            var defaults = {
                element:    "selection"
            }

            var options =  $.extend(defaults, options);
            var o = options;

            alert(o.element);
        },
        show: function(o) {
            alert(o.element);
        },
        hide: function() {
            alert(o.element);
        }
    };

 $.fn.plugin = function( method ) {

    if ( methods[method] ) {
      return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
    }    

  };

})( jQuery );

var blah = $('#hello').plugin('show'); // TypeError: o is undefined

私は答えとして得たいと思いselectionます...それは可能ですか?

編集:

(function($) {

    $.fn.plugin = function( method ) {

        if ( methods[method] ) {
          return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
          return methods.init.apply( this, arguments );
        } else {
          $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
        }    

     }; 

     $.fn.plugin.defaults = {
        attr: 'checked',
        expected: true,
        onChange: function(){}
      }; 

    var methods = {

        init: function(options) {
            var options = $.extend({}, $.fn.plugin.defaults, options);
            var o = options;

            var $this = this;

            $this.show();
            //alert(o.attr);
        },
        show: function(options) {

            var options = $.extend({}, $.fn.plugin.defaults, options);
            var o = options;

            alert(o.expected);
        },
        hide: function(object) {
            alert(o.element);
        }
    };


})( jQuery );

参照

var blah = $('#hello').plugin('show',{expected:"#hello world"}); 

今私は#hello world(正しい)を得る

しかし、

var blah = $('#hello').plugin('init'); // returns nothing

にアクセスtrueしているので、答えとして取得したいと思います。では、メソッドから他のメソッドにアクセスするにはどうすればよいですか?initshow

4

1 に答える 1

1

拡張可能なjqueryプラグイン(別名jQuery UIウィジェット)を再発明しようとしているように見えます。私はあなたがやろうとしていることを達成するための多くの方法をあなたに説明することができますが、それは本当に車輪の再発明です。jQuery UI Widget Factoryは、この種のものに最適です。

jQuery Widget Factory-これは彼らの古い文書ですが、他の何よりもウィジェットファクトリの概要を示しています、IMHO。彼らは1.9/1.10でそれにいくつかのマイナーな変更を加えましたが、ほとんどの概念はまだ同じです。

編集

これが私のコードへの変更です。これはあなたが探していたものだと思います。

(function($) {
    var methods = {
        init: function(options) {
            var defaults = {
                element:    "selection"
            }

            this.options =  $.extend(defaults, options);

            alert("init: " + this.options.element);
        },
        show: function() {
            alert("show: "  + this.options.element);
        },
        hide: function() {
            alert("hide: " + this.options.element);
        }
    };

 $.fn.plugin = function( method ) {
    if ( methods[method] ) {
      methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
    } 
    return this; // this is needed to ensure chainability
 };

})( jQuery );

var blah = $('#hello').plugin('init').plugin('show');​
于 2012-12-23T02:58:10.600 に答える