2013-07-03 2 views
0

정말, 내 코드의 패턴을보고 잠재적으로 단순화 될 수 있음을 깨닫고 있습니다. 그래서 궁극적 인 목표입니다. 이것은 특정 데이터 속성의 존재에 따라 다른 함수를 호출하는 필자가 쓰는 플러그인을위한 것이다.변수를 기반으로 다른 함수를 호출하십시오.

var a = $.extend({},$.bcplugins.defaults,options); 
var b; 

// a variable for each plugin's data attribute 
var crumbsInstances = doc.find('[data-bcp-crumbs]'), 
    copyrightInstances = doc.find('[data-bcp-copyright]'), 
    activeNavInstances = doc.find('[data-bcp-activenav]'); 


// Determine wich functions get called 
if (crumbsInstances.length) { 
    crumbsInstances.each(function() { 
     b = {}; 
     b = $$.extend({}, b, $(this).data(a.dataOptions)); 
     crumbs(a,b); 
    }); 
} 
if (copyrightInstances.length) { 
    copyrightInstances.each(function() { 
     b = {}; 
     b = $$.extend({}, b, $(this).data(a.dataOptions)); 
     copyright(a,b); 
    }); 
} 
if (activeNavInstances.length) { 
    activeNavInstances.each(function() { 
     b = {}; 
     b = $$.extend({}, b, $(this).data(a.dataOptions)); 
     activeNav(a,b); 
    }); 
} 

이 플러그인의 기능은 점차 커질 것입니다. 변수를 통해 if 문을 if 문으로 줄일 수 있습니까?

+2

실제로 질문하지 않았습니다. –

답변

1
이 같은

아마 뭔가 :

function processInstance($obj, callFunc){ 
    if ($obj.length) { 
    $obj.each(function() { 
     b = {}; 
     b = $$.extend({}, b, $(this).data(a.dataOptions)); 
     callFunc(a,b); 
    }); 
    } 
} 

var crumbsInstances = doc.find('[data-bcp-crumbs]'), 
    copyrightInstances = doc.find('[data-bcp-copyright]'), 
    activeNavInstances = doc.find('[data-bcp-activenav]'); 

processInstance(crumbsInstances, crumbs); 
processInstance(copyrightInstances, copyright); 
processInstance(activeNavInstances, activeNav); 
+0

나는 그것을 좋아한다. 그런 다음 새 함수를 추가 할 때마다 간단히 processInstance를 호출합니다. –

1

이전 답변을 확장하고 그것을 플러그인 만들기에 대한 의견을 추가하려면 :이 $.bcplugins.defaults를 요구 물론

(function($) { 
    if (!$.goData) { 
     $.extend({ 
      goData: function() { 
       function go($this, cb) { 
        var a = $.extend({},$.bcplugins.defaults,options); 
        if ($this.length) { 
         $this.each(function(i) { 
          b = {}; 
          b = $.extend({}, b, $(this).data(a.dataOptions)); 
          // use of apply allows for element to be passed to function 
          cb.apply($this, [a, b]); 
         }); 
        } 
       } 

       go($(document).find('[data-bcp-crumbs]'), $.goData.methods.crumbs); 
       go($(document).find('[data-bcp-copyright]'), $.goData.methods.copyright); 
       go($(document).find('[data-bcp-activenav]'), $.goData.methods.activeNav); 
      } 
     }); 
     $.goData.methods = { 
      crumbs: function(a,b) { console.log(this, a, b); }, 
      copyright: function(a,b) { console.log(this, a, b); }, 
      activeNav: function(a,b) { console.log(this, a, b); } 
     } 
    } 
})(jQuery); 

// use 
$.goData(); 

처음 포함하거나됩니다 단순히이 플러그인에 추가 할 수 있습니다.

관련 문제