2011-03-20 6 views
1

나는 Jamie Talbot's technique for OOP in jQuery을보고있다.jQuery OOP 기술 혼란

result = $(result); 

     var template = result[0]; 
     if (template) 
     { 
      for (var i in template) 
      { 
       if (typeof (template[i]) == 'function') 
       { 
        result[i] = function() 
        { 
         this.each(function() 
         { 
          this[i](); 
         }); 
        }; 
       } 
      } 
     } 

나는 if (typeof (template[i]) == 'function') 블록까지 이해하는 코드가 각 공용 방법을보고 있는지,이에 대한 논리를 이해하려고 할 때 나는 거의 그러나 나는 약간 길을 잃지있어, 대부분이 이해 그 플러그인에서 선언하지만, 그 후에 그것은 나를 boggles.

누군가가 이것을 통해 나를 단계 수행 할 수있는 기회가 있습니까?

다음은 Jamie의 원본 코드입니다.

(function($) { 
    $.fn.encapsulatedPlugin = function(plugin, definition, objects, options) { 
    var result = []; 
    objects.each(function() { 
     var element = $(this); 

     if (!element.data(plugin)) { 
     // Initialise 
     var instance = new definition(this, options); 

     // Store the new functions in a validation data object. 
     element.data(plugin, instance); 
     } 
     result.push(element.data(plugin)); 
    }); 

    // We now have a set of plugin instances. 
    result = $(result); 

    // Take the public functions from the definition and make them available across the set. 
    var template = result[0]; 
    if (template) { 
     for (var i in template) { 
     if (typeof (template[i]) == 'function') { 
      result[i] = function() { 
      this.each(function() { 
       this[i](); 
      }); 
      }; 
     } 
     } 
    } 

    // Finally mix-in a convenient reference back to the objects, to allow for chaining. 
    result.$ = objects; 

    return result; 
    }; 

})(jQuery); 
+0

majelbstoat의 답변 - 작업 코드 및 적절한 링크로 질문을 업데이트하는 것이 좋습니다. 건배. –

답변

1

실제로 이전 코드가 작동하고 있습니다. 지적했듯이, 이전 초안에서 기발한 동작이있었습니다 (캡슐화 된 단일 기능으로 첫 번째 버전 만 테스트했기 때문에 나중에 다시 문제가 있음을 하루나 이틀 후에 알 수 없었습니다 - http://jamietalbot.com/2010/08/26/object-oriented-jquery-plugins-mk-2/). 특히 인수 전달은 불가능했습니다. 그럼에도 불구하고 이후 몇 차례 반복되었습니다.

최신 코드는 on Github이며 많은 수정 및 최적화가 적용되었습니다. 의 각 요소에 공공 기능을 실행하는 래퍼 함수를 ​​작성, 플러그인 개체의 각 공용 함수의

:

당신이 생각에 관심이 코드의 비트에 대한 동작의 기본 이론은 이것이다 세트. 루프가 반복을 완료하면 함수 이름에 의해 키가 지정된 결과 개체가 생기며 각 구성원은 집합의 모든 요소에 대해 비슷한 이름의 기본 함수를 실행하는 함수가됩니다.

이 코드 조각은 특히 GitHub 버전에서 정리되었으므로 여기를보고 어떻게하는지보십시오.

최고,

제이미.

+0

설명해 주셔서 감사합니다. Jamie! – Chris

0

그냥 부러진 것처럼 보입니다. 동일한 i은 여러 번 바인딩됩니다 (새로운 함수 정의 만 새로운 범위 [read : free variable]을 도입 할 수 있습니다). result[i]은 (i 루프의 전류치 임)가 호출되면, 검사시 (루프로부터)을 마지막 값 i의 "참조"하는 기능을 포함한다.

(심지어 시도하지 않고) 나는 광고로을 작동하지 않는다고 주장합니다.

A는 버전이 될 것 "수정"

result[i] = (function (_i) { 
    return function() { 
    this.each(function() { 
     this[_i](); 
    }); 
    }; 
}(i)); 

해피 코딩 :)


내가 나머지를 설명하려고했지만, 내 머리가 myplugin 방법도 게시 실현 후 녹 다른 중요한 오류가 있으며 주석에서 벗어납니다. 더 이상 분석하려고하지 않습니다. 사용을 권장하지 않습니다.

+0

이봐, 네가 말하는 논평의 방향으로 나를 가리켜 줄 수 있겠 니? 나는 공식적인 가이드 라인을 언급하지 않고 이것을 코딩했다. 왜냐하면 내가 어디에서나 찾을 수 없기 때문이다. 건배! – majelbstoat

+0

그리고 완전성을 위해, 당신은 당신의 평가에서 옳았고, 나는 빨리 알아 냈고, 며칠 후에 바로 수정했습니다 :) http://jamietalbot.com/2010/08/26/object-oriented-jquery-plugins -mk-2/ – majelbstoat