2011-12-31 103 views
4

我開始使用移動框架LungoJS。我和javascript不工作很不錯,但我真的希望修改此原代碼:

ORIGINAL.JS

var mock = function() { 
     var mock = []; 
     for (var i=1; i<=5; i++){ 
      mock.push({ 
       id: i, 
       name: 'name n'+i, 
       description: 'description n'+i 
      }) 
     } 
     lng.View.Template.List.create({ 
      container_id: 'lives', 
      template_id: 'show_music_template', 
      data: mock  
     }) 
    } 
    return { 
     mock: mock 
    } 



})(LUNGO, App); 

這種原始的代碼工作正常,這很容易,現在我想要做的請求,利用$不用彷徨誰返回一個JSON文件,並填寫陣列像ORIGINAL.JS:

JSON結果:

{"result":[ 
    {"id":"52","username":"jgali","image":"Prova_(live)387.jpeg","name":"Prova (live)","type":"music","language":"Catalan","category":"8","tags":"indie, dine prova, indie live","description":"Aquesta es una prova online de reidiou","licence":"Reidiou License","played":"54","record_time":"45","facebook_id":"1052266203_2342869925158","twitter_hash":"#Provalive","create_date":"2011-11-01 13:04:21"}, 
    {"id":"52","username":"jgali","image":"Prova_(live)387.jpeg","name":"Prova (live)","type":"music","language":"Catalan","category":"8","tags":"indie, dine prova, indie live","description":"Aquesta es una prova online de reidiou","licence":"Reidiou License","played":"54","record_time":"45","facebook_id":"1052266203_2342869925158","twitter_hash":"#Provalive","create_date":"2011-11-01 13:04:21"} 
]} 

SERVICE.JS

var mock = function() { 
     var mock = []; 
     var url = 'http://localhost/app/rest/podcasts'; 
     var data = {}; 

     //lng.Service.get = $get 
     lng.Service.get(url, data,function(response) { 
      var array = []; 
      //Do something with response 
      jQuery.each(response.result, function() { 
        mock.push({ 
         id: this.id, 
         name: this.name, 
         description: this.description 
        })  
      }); 
      document.write(mock[1].id); 
     }); 
     lng.View.Template.List.create({ 
      container_id: 'lives', 
      template_id: 'show_music_template', 
      data: mock 
     }) 
    } 
    return { 
     mock: mock 
    } 

的問題是外循環我不能使用 「模擬」 陣列。當然,我犯了一個錯誤......但是有人知道這有什麼問題嗎?

謝謝。

+0

刪除'var'等'模擬= [];'聲明一個全局陣列,你將細 – 2011-12-31 18:34:39

+2

使用全局是抗圖案應該避免。 – 2011-12-31 18:41:33

回答

0

問題是$.get()需要時間來執行,因此是異步的。像這樣的異步調用涉及使用callback函數。要訪問mock數組,您需要在此回調中嵌套任何內容。你也可以強制AJAX調用在jQuery中是同步的(雖然我和文檔都對此提出警告);根據the docs

缺省情況下,所有的請求是非同步地發送(即,這是通過默認設置爲 真)。如果您需要同步請求,請將此選項設置爲 false。跨域請求和dataType:「jsonp」請求不支持 同步操作。請注意,當請求 處於活動狀態時,同步請求可能會暫時鎖定瀏覽器,禁用任何操作。

+0

「要訪問模擬數組,您需要在此回調中嵌套任何內容。」我如何得到它? \t 感謝您的回答 – galix85 2011-12-31 19:36:48

+0

@ galix85你知道什麼是嵌套和回調函數嗎?如果不是的話,我推薦一些基本的JS閱讀。 – 2012-01-01 06:09:02

0

謝謝!!正如你所說,我使用回調來解決問題。

我張貼代碼是否有任何人有興趣:

App.Services = (function(lng, app, undefined) { 

var mock = function() { 
     var mock = new Array(); 
     var url = 'http://localhost/app/rest/podcasts'; 
     var data = {}; 

     function getData (url,data,mock,callbackFnk){ 
      lng.Service.get(url, data,function(response) { 
       //Do something with response 
       // now we are calling our own callback function 
       if(typeof callbackFnk == 'function'){ 
        callbackFnk.call(this, response); 
       }else{ 
        document.write("Error"); 
       } 

      }); 
     } 
     getData(url,data,mock,function(response){ 

      jQuery.each(response.result, function() { 
        mock.push({ 
         id: this.id, 
         name: this.name, 
         description: this.description 
        }) 

      }); 

      lng.View.Template.List.create({ 
      container_id: 'lives', 
      template_id: 'show_music_template', 
      data: mock 
      }) 
     })  
    } 

    return { 
     mock: mock 
    } 

})(LUNGO, App);