2013-06-17 3 views
0

나는이 방법을 사용하는 사람보다 훨씬 쉽게 찾을 수있는 질문이 있지만, 아쉽게도 커스텀 jQuery 플러그인에 대한 많은 경험이 없습니다.Multisuggest 플러그인에서 jQuery 클로저가 작동하지 않는 매개 변수를 전달하는 중

내 작업장의 이전 개발자가 제대로 작동하지 않는 왼쪽에있는 많은 플러그인을 남겼습니다. 대부분 해결할 수 있었지만이 문제는 나를 괴롭혔습니다. 동안.

그것이 jQuery를에 기록하고, 그것을 (* 예 setValue의 박스의 값을 설정하기 위해 내부적으로 사용하는 기능 세트가 맞춤 여러 제안 플러그인 (호출 multisuggest) 또는 룩업

: 검색) *

그가 (이 exteranl 스크립트는 특히 사용자 입력을 통해 multisuggest에 새로 생성 된 제안을 가져 외부 스크립트에서 이러한 플러그인 함수를 호출하려고 것 같습니다과 같은) 값을 설정

를 업데이트

this.$input.multisuggest('setValue', data.address.id, address); 

두 번째 및 세 번째 매개 변수가 함수에 전달되지 않는 것 (setValue는 수신하지 않음)을 제외하고 함수를 호출하는 것처럼 보입니다. 전달할 수있는 방법을 이해하지 못합니다. 이들. 그것은 콘솔에 로그인 할 때 정의되지 않는다고 말합니다.

MultiSuggest.prototype = $.extend(MultiSuggest, _superproto, { 

    constructor : MultiSuggest, 
    select: function() { // When selecting an address from the suggestions 
     var active, display, val; 

     active = this.$menu.find('.active'); 
     display = active.attr('data-display'); 
     val = active.attr('data-value'); 
     this.setValue(display, val, false); // This works, however when I do it as shown in the above example from an external script, it doesn't. This is because it doesn't receive the arguments. 

    }, 
    setValue : function(display, value, newAddress) { // Setting the textbox value 
     console.log(display); // This returns undefined 
     console.log(value); // This returns undefined 
     if (display && display !== "" && 
      value && value !== "") { 
      this.$element.val(this.updater(display)).change(); 
      this.$hiddenInput.val(value); 
      this.$element.addClass("msuggest-selected"); 
     } 
     if(newAddress === false){ 
      return this.hide(); 
     } 
    }, 
}); 

가 왜이 기능을들을 않습니다 기능은 (난 단지 내가 사용 하나 실제로 작동 선택이라고 multisuggest에서 내부 기능을 포함 한 )과 같이 명시되어 있습니다 ,하지만 전달 된 값이 아닌? 이러한 인수를 정의하기 위해 어딘가에 추가 코드 줄을 포함해야합니까?

jQuery 경험이있는 사람이라면 누구나 도움이 될 것입니다. 현재 프로젝트에서 병목 현상이 발생합니다. 시간 내 줘서 고마워!

편집 : 외부 스크립트에서 플러그인의 내부 기능으로 인수가 전달되는 방법에 대한 코드를 놓쳤습니다. 다음은 외부 호출이 처리되는 방법에 대한 플러그인 정의입니다. 누구나이 문제를 볼 수 있습니까?

$.fn.multisuggest = function(option) { 
    return this.each(function() { 
     var $this = $(this), data = $this.data('multisuggest'), options = typeof option === 'object' && option; 
     if (!data) { 
      $this.data('multisuggest', (data = new MultiSuggest(this, options))); 
     } else if (typeof(option) === 'string') { 
      var method = data[option]; 
      var parameters = Array.prototype.slice.call(arguments, 1); 

      method.apply(this, parameters); 
     } 
    }); 
}; 
+0

상속 모델이 약간 이상하게 보일 수도 있지만 로그 문이 전혀 작동하지 않을 수도 있습니다. 'set()'이외의 다른 곳에서'setValue()'가 호출 되었습니까? 모든 통화를 추적하여 각 통화가 유효한 '표시'와 '가치'를 통과하는지 확인하십시오. –

+0

나는 setValue를 실제로 호출 한 곳을 명확히하지 않았으므로이 질문을 수정했다. 첫 번째 스 니펫 코드는'this. $ input.multisuggest ('setValue', data.address.id, address);가 실제로 외부 스크립트 **에서 호출되고 있음을 보여줍니다. 즉, 새 주소를 만들고 제안 상자에 가져 오는 스크립트입니다. 나는 여러 입력 상자에서 무언가를 선택할 때 나는, 디스플레이 및 값을 기록 는 , 쉽게 변수를 전달하지만, 그것은 범위의 안에 있기 때문에 분명히이다. 외부 스크립트에서 호출 할 때 함수가 작동하지 않는다고 말한 것과 같습니다. – SixteenStudio

+0

(즉각적인) 문제는 외부 스크립트에있는 것처럼 보입니다. 'this. $ input.multisuggest (...);'가 호출되면'data'와'address'가 아직 존재하지 않는 것처럼 보입니다. 나는 비동기 문제를 의심 할 것이다. 예를 들어 콜백이나'.done() '핸들러 안에서 그 라인을 옮겨야 할 필요가있다. –

답변

1

은 "보통"플러그인 관리자는 다음과 같습니다

// ***************************** 
// ***** Start: Supervisor ***** 
$.fn.multisuggest = 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 { 
     $.error('Method ' + method + ' does not exist in jQuery.' + pluginName); 
    } 
}; 
// ***** Fin: Supervisor ***** 
// *************************** 

모든 this 통해 반복하는 것이 아니라 관리자에서, 방법 함수 내부에 있어야한다.

new MultiSuggest(...)이 현재 관리자에게 표시 될지 조금 걱정됩니다. 그런 종류의 일은 전혀 관례가 아닙니다. 원저자는 분명히 염두에 두었습니다.

+0

나는 그것을 얻었다 고 생각한다. 원래의 감독자는 또한'init' 액션을 수행합니다. init 코드는 적절한 'init'메소드로 옮겨야합니다. –

+0

이 "배열"배열을 어디에서 설정해야합니까? 플러그인 자체에서는 설정되지 않는 것 같습니다 ... 표준이지만이 플러그인을 작성한 방식으로는 메소드 배열이 포함되어 있지 않습니다. . 배열을 생성해야합니까? – SixteenStudio

+0

또한 적절한 init 메소드가 있습니다 ... 아마도 외부 스크립트에 전체 스크립트를 포함시켜야합니다. 분명히 보이지 않는 많은 추가 코드가 있습니까? – SixteenStudio

0

당신은 그 기능은 아마 단지 복용하고 하나 개의 매개 변수를 전달하고, $.fn['multisuggest']에 부착 된 jQuery 플러그인 기능을 확장 할 필요가있다.

+0

플러그인 자체가 이미 확장되어 있으므로 필 요한 매개 변수를 전달하려면 외부로 확장해야합니까? – SixteenStudio

관련 문제