2012-04-03 5 views
1

나는 내 플러그인에 jQuery.Widget Factory을 사용하는 이점에 대해 많이 읽었습니다. 하나의 위장 된 기능 중 하나는 jQuery.widget이 위젯의 ​​이름표를 만드는 방법입니다. jQuery 컨텍스트 내에서 (자연스럽게) 현재 네임 스페이스를 유지할 수 있기 때문에 이것은 매력적이다.왜 내 jQuery.Widgets 네임 스페이스에 액세스 할 수 없습니까?

인한 문제 :
나는 "$ (". myWidget을 ")가 계속 오류. namespace.newWay는 함수가 아닙니다." 다음과 같은 요소에 대해

...

<div class="myWidget"></div> 

THIS EXAMPLES 코드가 작동합니다
좋은 동안 ... 이것이 내가 아직도 원하는대로 ... 달성하기 위해 노력하고 NOT 것입니다 내 존경받는 네임 스페이스.

var workingVersion = { 
      _init: function() { /* Do Something*/ } 
     }; 
$.widget("ui.workingVersion", workingVersion); 

$(document).ready(function() { 
    $('.myWidget').workingVersion(); 
}); 

는하지만, 내 코드는 실패

var namespace = namespace || { }; 
;namespace.newWay = (function ($, window, document, undefined) { 

    return function (options) { 

      var self = this; 

      this._create = function() { 
       // Do something 
      }, 
      this._init = function() { 
       // Do something 
      }, 
      this.publicFunction = function() { 
       // Do something 
      }; 
    }; 
})(jQuery, window, document); 

$(document).ready(function() { 
    $.widget("ui.namespace.newWay", namespace.newWay); //<-- Namespace does get appended 
    $('.myWidget').namespace.newWay({ type: 'testing' }); //<-- But still fails here 
}); 

내 질문은 :
은 왜 실패 하는가?

관련 독서 :

+0

그리고 당신의 questio을 대신 이런 식으로 호출 n은 "왜 실패할까요?"입니다. 그 질문에 답하기 위해, 나는 왜 당신이 다른 접근 방식을 취하기로 결심했는지 그리고이 새로운 접근법으로부터 얻으려는 것을 이해해야합니다. – Neil

+0

'$ ('. myWidget'). newWay();'어떻게 호출 할 수 있습니다. '$()'인스턴스에서 네임 스페이스를 사용할 필요가 없습니다. – zzzzBov

+0

답해 주셔서 감사합니다 : (a) 네임 스페이스를 사용하는 것이 목표입니다! (b) 네임 스페이스에 액세스 할 수없는 경우 네임 스페이스를 추가하는 이유는 무엇입니까? (c) 샘플 기사는 그것이 가능함을 암시한다. –

답변

1

이 대답은 조금 늦게, 어쩌면,하지만 같은 일을 고민하고 있었다 온다 약간의 독서를하십시오.

$() 일반

$() 인스턴스는 서로 다른 네임 스페이스에 흩어져 다른 기능에 노 네임 스페이스 바로 가기 목록입니다. 같은 이름으로 두 가지 기능을 추가하는 경우 다음

$("...").myFunction(); 

를 호출하여 액세스 할 것

$.fn.myFunction = function() { 
    ... 
}; 

는 후자가 첫 번째를 덮어 쓰게됩니다 : 당신은 서면으로이 바로 가기 목록에 더 많은 기능을 추가 할 수 있습니다 .

위젯

당신이 당신이 기대대로, 네임 스페이스의로 만든 것 네임 스페이스와 위젯을 만들 수 있지만 $()로는 실제 위젯 뿐인데로 단순화 된 바로 가기로, 그것은 네임 스페이스의없이 추가됩니다 지름길. 이 작업은 $.widget.bridge()을 사용하여 수행됩니다.원래 네임 스페이스 당신이 할 수있어

$("#myDiv").namespace_myFunction(); 

가 직접 위젯을 사용하려면 :

$.widget.bridge("namespace_myFunction", $.namespace.myFunction); 

그리고이 같은 위젯에 액세스 : 당신은 그러므로 다음과 같이 작성하여 $()에 자신의 네임 스페이스 링크를 만들 수 있습니다 ...이 조금 명확합니다

$.namespace.myWidget(
    { 
    option1: "", 
    option2: "" 
    }, 
    $("#div") 
); 

희망

+0

나는 오랫동안 잊어 버린 질문에 큰 설명을했다. –

+0

당신이 설명을 좋아해서 기뻐 :) – Ohlin

관련 문제