2011-12-31 107 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);