2011-08-11 2 views
2

jquery의 웹 사이트에서 플러그인 제작 지침을 따르고 있지만 동일한 플러그인 내의 다른 메소드에서 기본 플러그인 메소드를 호출하는 방법을 찾지 못했습니다. JQuery와의jquery 플러그인을 제작할 때 다른 플러그인에서 내 플러그인 메소드를 호출하려면 어떻게해야합니까?

(function($){ 
var methods = { 
    init: function(options) { 
     var settings = {}; 

     //this == context element of plugin, already jquery 
     return this.each(function() { 
      var $this = $(this); 
      if(options) { 
       settings = $.extend({}, settings, options); 
      } 
      var data = $this.data('PluginData'); 
      if(!data) { 
       //set up      
      } 

     }); 
    }, 
    some_fn: function() { 
     //do some stuff 
    }, 
    another_fn: function() { 
     //do other stuff, then somehow call some_fn(), maybe via methods.some_fn() ?  
    } 
}; 

jQuery.fn.SomePlugin = 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 { 
     console.log('there was an error'); 
    } 
}; 
})(jQuery); 

이것은 꽤 많이 골격 코드 :

는이 같은 플러그인을 가지고있다. 그러나, 내가 가진 문제는 내 플러그인 메소드를위한 "유틸리티"기능을 만드는 가장 좋은 방법을 찾는 것입니다. 또는 다른 플러그인 메소드를 호출하는 방법입니다.

예를 들어, 내 플러그인에는 init, some_fnanother_fn의 세 가지 메소드가 있습니다. $('#el').SomePlugin('another_fn')으로 전화하시는 경우 another_fn 번에 some_fn으로 전화하겠습니다. 어떻게해야합니까? 그러나 methods.some_fn()을 호출하면 작동하지만, 메서드가 메서드 개체 내에 정의 된 순서에 따라 다릅니다. 따라서 some_fnanother_fn으로 부를 수는 있지만 그 반대는 아닌가요?

또한 내 플러그인의 모든 메소드에서 사용할 수있는 유틸리티 함수를 만드는 올바른 방법은 무엇입니까? 그래야 전역 네임 스페이스가 복잡해지지 않을까요? var 메소드를 호출하기 바로 전에 플러그인 시작 부분에 유틸리티 함수를 정의합니까?

편집 : Matt Ball에게 감사 드리며, methods.some_fn()이 다른 주요 메소드를 호출하기 위해 작동하는지 확인했습니다. 이제는 (개인) 유틸리티 함수를 작성하는 가장 좋은 방법이 무엇인지 알고 싶습니다.

+0

내가 [jQueryUI 위젯 팩토리] (HTTP를 사용하여 JQ 플러그인을 쓰기 시작했을 때 : // 위키를. jqueryui.com/w/page/12138135/Widget-factory). 나는 이것이 당신의 질문에 대한 즉각적인 대답이 아니라는 것을 알고 있습니다. 그러나 그것은 한 번 볼 가치가 있습니다. – bfavaretto

+0

_ "... 이것은 메소드가 메소드 객체 내에 정의 된 순서에 따라 다르지만 맞습니까?"_ 사용자가 묻는 것을 이해하면 대답은 ** 아니요 ** 주문에 의존하지 않습니다. –

+0

당신은 맞습니다. 그리고 그것은 methods.some_fn()이 일하는 것 같아서, 제 질문에 대답을합니다. –

답변

0

모범 사례를 확인하려면 체크 아웃해야합니다. http://jqueryboilerplate.com 그들은 정확한 질문에 대한 예제를 제공합니다. :)

은 예를 들어 당신은 init 함수의 범위를 활용할 수 있습니다 : 내 인생이 변경

(function($){ 
var methods = { 
    init: function(options) { 
     var settings = {}; 

     var privateMethod = function(){ ... } 

     //this == context element of plugin, already jquery 
     return this.each(function() { 
      var $this = $(this); 
      if(options) { 
       settings = $.extend({}, settings, options); 
      } 
      var data = $this.data('PluginData'); 
      if(!data) { 
       //set up      
      } 

     }); 
    }, 
    some_fn: function() { 
     //call private function 
     privateMethod() 
     // do some stuff 
    } 
}; 

jQuery.fn.SomePlugin = 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 { 
     console.log('there was an error'); 
    } 
}; 
})(jQuery); 
관련 문제