2012-09-19 153 views
1

我正在尝试找出一个函数,它可以在大约10个函数中进行迭代。使用jquery从另一个函数调用一个函数

我有一个函数创建服务来调用一个json url到我的函数中。这与主函数进行通信,在主函数下面调用服务函数,将相应url的选项用作启动json请求的数据。请看下面;

var landp = { 
getCountryCode : function(){ 
    console.info('landp.GetCountryCode'); 
    return window.location.pathname.match(/\/([a-zA-Z]{2})/)[1].toLowerCase(); 
}, 
Service : { 
    getBaseUrl : function(){ 
     console.info('landp.Service.GetBaseUrl'); 
     return sprintf("/%s/service", landp.getCountryCode()) 
    }, 
    callService : function(method, options){ 
     console.info('landp.Service.CallService'); 
     var url = sprintf("%s/%s", landp.Service.getBaseUrl(), method); 
     $.ajax({ 
      url : url, 
      method : 'GET', 
      success : options.success, 
      error : options.error 
     }) 
    }, 
    getCategories : function(options){ 
     landp.Service.callService('category', options); 
    }, 
    getCategoryId : function(options){ 
     landp.Service.callService('category/id/13', options); 
    }, 
      getCategoryTopTen : function(options){ 
     landp.Service.callService('category/name/top-ten', options); 
    }, 
    getSeeMoreItems : function(options){ 
     landp.Service.callService('see-more', options); 
    }, 
    getPartnerOffers : function(options){ 
     landp.Service.callService('partner-offers', options); 
    } 
} 

}

这工作好,你可以看到getCategoryTopTen将调用认为我需要使用以获得正确的项目,如item.name,item.description等等等等JSON数据的URL 。代码如下。

landp.Service.getCategoryTopTen({ 
    success : function(data){ 
     $('#header').after('<div id="cat-sub-options"></div>'); 
     $('#cat-sub-options').after('<div class="flexslider"><ul class="slides"></ul></div><div id="carousel-button" class="click"></div>');    
     $.each(data[0].items, function(i, item){ 
     $('.flexslider .slides').append('<li class=""><h5>' + i + '</h5><a href="' + item.url + '"><img src="' + item.imageLargeUrl + '" alt="' + item.name + ' image" /><span>' + item.name + '</span></a></li>'); 
    }); 
    }, 
    error : function(){ 
     console.log("Error getting categories"); 
    } 
}) 

正如你可以看到上面的代码工作,它将正确的信息拉入正确的元素等。目前约有10个类别,如;

getCategoryTopTen getCategoryHistoryHeritage getCategoryWheretogo getCategoryShopping getCategorySportyPeople

正如你可以看到每一个将被分配给在JSON文件中的类URL。

我想要解决的是我如何做到以上所有的类别例如我们有:landp.Service.getCategoryTopTen与下面的代码,而不是写在每个类别itout我可以传递一个变量,而不是每个功能其他明智的我将不得不做每个类别的这些JSON调用。

任何帮助将不胜感激。

谢谢, 马克

+0

请使用简单的字符串与'+'运算符连接,而不是'sprintf'函数(它在内部执行相同的操作,甚至在使用正则表达式替换等时)。 JavaScript是一种高级语言:-) – Bergi

回答

0

我不知道我完全理解这个问题是什么,但你可以使用[]符号访问JavaScript的孩子们受益不少。因此,例如,而不是调用 landp.Service.getCategoryTopTen()你可以调用landp.Service["getCategoryTopTen"](),然后这可能再拉出所以你有这样的:

var category="TopTen" 
var method="getCategory"+category 
land.Service[method](...) 

然后你可以环绕你的逻辑来遍历或其他自动化。

+0

我不完全相信我理解这种方法? –

+0

在JavaScript中,您可以通过点符号'Object.function'或索引样式符号'Object [“function”]'来访问任何对象成员,因为索引样式使用一个字符串,您可以像处理其他字符串一样操作该字符串。这仍然返回相同的对象引用。由于JS具有一流的功能,一旦你获得了对象引用,你只需要通过添加'(args)'调用来调用它。如果你将它分解成行并将其想象为:可能会更清晰: var method = Object [“method”];方法();' –

0

您可以遍历方法名称的数组,并每次使用相同的回调函数调用它们。入门的功能可以通过使用括号标记来完成:

landp.Service[methodname](function(){…}); 

不过,我会强烈建议不要定义为系统中的每个类别额外的方法,但只是使类别名称参数传递给函数:

… 
getCategoryById: function(id, options){ 
    landp.Service.callService('category/id/'+id, options); 
}, 
getCategoryByName: function(name, options){ 
    landp.Service.callService('category/name/'+name, options); 
}, 
… 

现在,循环在你的阵列更方便:

var cats = ["top-ten", "HistoryHeritage", "Wheretogo", "Shopping", "SportyPeople"]; 
for (var i=0; i<cats.length; i++) { 
    var catname = cats[i]; 
    landp.Service.getCategoryByName(catname, {…}); 
} 

顺便说一句,你就需要从要素删除的ID,因为您将创建届时间多次 - 但ID必须是唯一的。

+0

查看从json创建滑块的部分是使事情运行缓慢的位。所以这就是为什么我不想用上面的代码重复创建相同的功能。尽管我对这种方法有些困惑? –

+0

是的,如果您查询多个服务并同时显示结果,您的成功函数将需要一些适应性 – Bergi