2012-11-18 31 views
0

如果有人能幫助我我有倒閉的問題和檢索一個私有變量聲明爲使用jQuery的ID選擇一個元素。我有一個模塊,像這樣:jQuery的封閉無法檢索私有變量與DOM對象

var package = package || {}; 

(function() { 
     if(!package.slider) 
       package.slider = {}; 

     function Slider() { 
     } 

     // --------- /Public Members --------- // 
     Slider.prototype = { 
      init: function(){ 
       _setEvents(); 
      } 
     }; 

     // --------- Public Members --------- // 


     // --------- Private Members --------- // 
     var shoePreview = $('#shoe-preview'); /*somehow this variable does NOT get recognised even though I have it in the DOM.*/ 

     function _setEvents(){ 
      $.subscribe('getAllPerspectives', function(event){ _getAllPerspectives() }); 
      $.subscribe('showPreview', _show); 
      $.subscribe('hidePreview', _hide); 
     } 

     function _getAllPerspectives(){ 
      _getAngleShoeImage(helper.getCurrentAngle()); 
      $.each(constants.angles, function(key, val){ 
       if(val != helper.getCurrentAngle()){ 
        _getAngleShoeImage(val); 
       } 
      }); 
     } 

     function _getAngleShoeImage(angle){ 
      var shoeImage = shoePreview; 
      shoeImage.html('<p>Hello World</p>'); 

     } 


     var that = new Slider(); 
     package.slider = that; 

    })(); 
$(document).ready(function(){ 

    $.each(package, function (key, val){ 
     val.init(); 
    }); 
}); 

現在,如果你在代碼中望去,有一個名爲shoePreview變量,我以爲不會到模塊之外的任何訪問。

現在在某處代碼以後我會叫一些方法將觸發_getAngleShoeImage在那裏我有叫shoeImage設置爲私有shoePreview變量內部變量。

的問題是,一旦我嘗試使用jQuery的HTML()調用它似乎不承認shoePreview變量是什麼。

我和代VAR shoeImage = $(「#鞋預覽」),然後調用HTML()與所需的標記測試這一點,它工作正常。

這個問題是如此之小,但它的駕駛我堅果。我是否正在編寫var shoePreview = $('#shoe-preview');以錯誤的方式或有更多的東西。任何幫助將不勝感激。

謝謝。

回答

1

這裏只有一個問題: (function(){hackhackhack()})()字面意思 - 運行關閉,這意味着你嘗試過它來訪問DOM準備好了,你只需要設置VAR 初始化,而不是在主函數,

var package = package || {}; 

(function() { 
    if(!package.slider) 
      package.slider = {}; 

    function Slider() { 
    } 

    // --------- /Public Members --------- // 
    Slider.prototype = { 
     init: function(){ 
      //New function here 
      _setVars(); 
      _setEvents(); 
     } 
    }; 

    // --------- Public Members --------- // 


    // --------- Private Members --------- // 
    //make it accessible for other proto functions; 
    var shoePreview; 

    function _setVars() { 
     shoePreview=$('#shoe-preview'); // now it will be set when init() run not when object proto initialised 
    } 
    function _setEvents(){ 
     $.subscribe('getAllPerspectives', function(event){ _getAllPerspectives() }); 
     $.subscribe('showPreview', _show); 
     $.subscribe('hidePreview', _hide); 
    } 

    function _getAllPerspectives(){ 
     _getAngleShoeImage(helper.getCurrentAngle()); 
     $.each(constants.angles, function(key, val){ 
      if(val != helper.getCurrentAngle()){ 
       _getAngleShoeImage(val); 
      } 
     }); 
    } 

    function _getAngleShoeImage(angle){ 
     var shoeImage = shoePreview; 
     shoeImage.html('<p>Hello World</p>'); 

    } 


    var that = new Slider(); 
    package.slider = that; 

})(); 
$(document).ready(function(){ 

    $.each(package, function (key, val){ 
     val.init(); 
    }); 
}); 
+0

謝謝,我認爲這可能做的伎倆。所以在做完這些之後,我能夠獲得一個對象,但是,當我嘗試使用html()來查看內部的標記時,它似乎總是返回undefined,當我嘗試將其輸出爲警報時。這很奇怪。 :(任何可能出錯的地方? – koramaiku

+1

你試過我的第一個方法還是最後一個? –

+0

對不起我剛剛意識到你編輯了你的答案:) – koramaiku