2011-05-05 7 views
5

많은 다른 비슷한 질문과 마찬가지로 여기서는 jQuery 플러그인을 처음 작성했습니다. 선택 요소를 가져 와서 클릭 할 수있는 목록 요소로 대체하여 견본으로 사용하기위한 것입니다. 주요 기능이 훌륭하게 작동하지만 다른 옵션을 호출 할 수있는 기능을 추가해야합니다. 그러면 특정 옵션이 비활성화됩니다. 내 문제는이 일을 할 때 일부 클릭 요소를 바인딩하고 다른 요소를 바인딩 해제해야한다는 것입니다.Jquery 플러그인, 다른 메소드의 함수 호출

현재 내 원래 바인딩은 'init'메소드 내부의 함수에 포함되어 있습니다. 다른 '비활성화'메서드에서 해당 함수를 호출 할 수 있어야합니다.

다음
(function($){ 

var methods = { 

    // Init method 
     init : function(options) { 
      // Set options 
      var 
       defaults = { 
         clickCallback: function(){} // Define empty function for click callback 
        } 
      , settings = $.extend({}, defaults, options) 


      // Function to bind options 
      function fnBindOptions(var1, var2, var3) { 
       // Stuff to bind elements 

        // Hit the click callback 
        settings.clickCallback.call(this); 

      } 

      return this.each(function() { 

       // Check that we're dealing with a select element 
       if(element.is('select')) { 

        // Loop through the select options and create list items for them 
        $('option', element).each(function() { 

         // Stuff to create list elements 

         // Bind click handler to the new list elements 
         fnBindOptions(var1, va2, var3); 
        }); 

       } 

      }); 

      // return 
      return this();    
     } 


    // Disable buttons method 
    , disable : function(options) { 

      // I need to access fnBindOptions from here 
      $(elementID).children('li').removeClass('disabled').each(function(){ 
       fnBindOptions(var1, var2, var3); 
      }); 

     } 
}; 

내 문제입니다 : 그래서 여기에 몇 가지 코드의 내가 그것을 비활성화하기 전에 각 옵션에 bind 함수를 호출 할 필요가 -하지만 비활성화 방법 내에서 fnBindOptions에 액세스 할 수 없습니다 - 그리고 fnBindOptions는 콜백을 포함하기 때문에 'settings'변수에서 'init'메소드 외부로 이동할 수 없습니다.

누구에게 조언이 있습니까?

감사합니다. 이 문제를 해결하기 위해

답변

6

한 가지 방법은 methods 객체 (또는 넓은 범위의 다른 개체)에 defaults, settingsbindOptions 기능을 넣어 적절하게 참조 할 수 있습니다 :

var methods = { 
    defaults: { 
     clickCallback: function() {} 
    }, 
    settings: {}, 

    bindOptions: function(var1, var2, var3) { 
     // Stuff to bind elements 
     // Hit the click callback 
     methods.settings.clickCallback.call(this); 
    }, 

    // Init method 
    init: function(options) { 
     methods.settings = $.extend({}, methods.defaults, options); 

     return this.each(function() { 
      if (element.is('select')) { 
       $('option', element).each(function() { 
        // Stuff to create list elements 
        // Bind click handler to the new list elements 
        methods.bindOptions(var1, va2, var3); 
       }); 
      } 
     }); 
    }, 

    // Disable buttons method 
    disable: function(options) { 
     $(elementID).children('li') 
        .removeClass('disabled') 
        .each(function() { 
      methods.bindOptions(var1, var2, var3); 
     }); 
    } 
}; 
+1

브릴리언트, 그것은 완벽하게 작동하는 것 같다 . 감사!! –

+0

위대한 대답은 확실히 나를 도왔습니다. 고마워요. – Asciant

+0

"메소드"가 아직 초기화되지 않았을 수도 있다는 경고를받습니다.이 메소드는 JSLint를 전달합니까? –