2010-06-05 70 views
2

我創建使用模式從Plugins Authoring頁的jQuery插件:在私有方法中使用`this`的jQuery插件設計模式?

(function($) { 

    $.fn.myPlugin = function(settings) { 
    var config = {'foo': 'bar'}; 

    if (settings) $.extend(config, settings); 

    this.each(function() { 
     // element-specific code here 
    }); 

    return this; 

    }; 

})(jQuery); 

我的代碼要求操縱this幾個私有方法。我正在使用apply(this, arguments)模式調用這些私有方法。有沒有設計我的插件的方法,我不必打電話申請通過this從方法到方法?

我修改插件代碼看起來大致是這樣的:

(function($) { 

    $.fn.myPlugin = function(settings) { 
    var config = {'foo': 'bar'}; 

    if (settings) $.extend(config, settings); 

    this.each(function() { 
     method1.apply(this); 
    }); 

    return this; 

    }; 

    function method1() { 
    // do stuff with $(this) 
    method2.apply(this); 
    } 

    function method2() { 
    // do stuff with $(this), etc... 
    } 

})(jQuery); 

回答

0

只需創建一個範圍變量指向此

(function($) { 
    var me; 
    $.fn.myPlugin = function(settings) { 
    var config = {'foo': 'bar'}; 
    if (settings) $.extend(config, settings); 
    me = this; 
    this.each(method1); 
    return this; 
    }; 

    function method1() { 
    // do stuff with me 
    method2(); 
    } 

    function method2() { 
    // do stuff with me, etc... 
    } 

})(jQuery); 
+2

你應該使用'me'不完全負責這些方法,而不是'$(me)','this'已經是一個jQuery對象,在重新包裝它時它是一個不必要的克隆。我會在這裏閱讀這樣的常見錯誤:http://remysharp.com/2010/06/03/signs-of-a-poorly-written-jquery-plugin/ – 2010-06-05 20:57:00

+1

我不使用jQuery自己,它的一個蹩腳的圖書館:)但我會更新答案 – 2010-06-05 22:26:45

4

我覺得jQuery.proxy是爲這些問題的產生,雖然在總體上不類似於你所做的:

this.each(jQuery.proxy(method1, this)); 
+0

感謝您的迴應。 'jQuery.proxy'函數對我來說是新的。是不是隻是'method1.apply()'的語法糖? – thebossman 2010-06-06 17:18:12

+0

@thebossman - 內部是'.apply()':http://github.com/jquery/jquery/blob/master/src/core.js#L689 – 2010-06-07 12:18:03

1

我可以建議兩種方式:

  1. 這樣更清楚,但該任務

    ​​
  2. 這種方式是更extremally)))

    (function($) { 
        var privates = { 
         method1: function() { 
         // do stuff with this 
         alert(this.attr('id')); 
         this.method2(); 
         }, 
         method2: function() { 
         alert(this.attr('customAttr')); 
         // do stuff with this, etc... 
         } 
        } 
        $.fn.myPlugin = function(settings) { 
         var config = {'foo': 'bar'}; 
    
         if (settings) $.extend(config, settings); 
    
         this.each(function() { 
          var $this = $(this); 
          $.extend($this, privates) 
          $this.method1(); 
         }); 
    
         return this; 
        }; 
    })(jQuery); 
    
相關問題