Javascript 在(多维)$中传递对象。每个对象在闭包外部运行
我想将产品对象从$.each(函数内部)循环传递到闭包外部的函数 当I console.log记录产品(对象)时,它会给我: “未捕获引用错误:未定义产品” 这是我的密码,请告诉我遗漏了什么:Javascript 在(多维)$中传递对象。每个对象在闭包外部运行,javascript,jquery,loops,multidimensional-array,each,Javascript,Jquery,Loops,Multidimensional Array,Each,我想将产品对象从$.each(函数内部)循环传递到闭包外部的函数 当I console.log记录产品(对象)时,它会给我: “未捕获引用错误:未定义产品” 这是我的密码,请告诉我遗漏了什么: function openMenu(url){ // get feed from API $.getJSON(url, function(storedata) { $('#live-menu').addClass('active'); $('.live-menu-
function openMenu(url){
// get feed from API
$.getJSON(url, function(storedata) {
$('#live-menu').addClass('active');
$('.live-menu-content').addClass('active');
// each the feed data
$.each(storedata, function(categoryName, productObject){
// category title and open table
$('.live-menu-content').append('<h1 class="menu-category-title">'+categoryName+'</h1>');
$('.live-menu-content').append('<table class="table table-'+categoryName+'"><tbody>');
//go through products
$.each( productObject, function( productId, product ) { j++;
$('.table-'+categoryName+'').append('<tr><td>'+product.name+'<br/><small>'+product.description+'</small></td><td>€'+product.price+'</td><td><a onclick="addToCart(product);" class="btn btn-primary pull-right" href="#">Add</a></td></tr>');
});
// close table
$('.live-menu-content').append('</tbody></table>');
});
})
// on fail
.fail(function() {
alert( "Error!" );
});
return false;
}
function addToCart(product){
console.log(product);
return false;
};
函数openMenu(url){
//从API获取提要
$.getJSON(url、函数(storedata){
$(“#实时菜单”).addClass(“活动”);
$('.live菜单内容').addClass('active');
//每个人都需要输入数据
$.each(存储数据、函数(categoryName、productObject){
//类别标题和打开表
$('.live菜单内容')。追加(''+categoryName+'');
$('.live菜单内容')。附加('');
//检查产品
$.each(productObject,function(productId,product){j++;
$('.table-'+categoryName+'').append(''+product.name+'
'+product.description+'欧元'+product.price+'');
});
//闭桌
$('.live菜单内容')。附加('');
});
})
//失败时
.fail(函数(){
警报(“错误!”);
});
返回false;
}
功能addToCart(产品){
控制台日志(产品);
返回false;
};
我想您已经意识到了这一点,但是您的产品
仅在您的每个
功能范围内定义。该产品用于呈现DOM元素。而不是呈现实际产品,而是呈现文本字符串“product”,它不存在于循环范围之外。单击DOM元素时,单击事件位于完全独立的范围内。您可以将产品的id传递给函数吗?然后在处理函数中查找产品?您还需要创建一个全局存储
对象,以便以后引用它:
var store;
function openMenu(url){
// get feed from API
$.getJSON(url, function(storedata) {
store = storedata; //assign to global object
$('#live-menu').addClass('active');
$('.live-menu-content').addClass('active');
// each the feed data
$.each(storedata, function(categoryName, productObject){
// category title and open table
$('.live-menu-content').append('<h1 class="menu-category-title">'+categoryName+'</h1>');
$('.live-menu-content').append('<table class="table table-'+categoryName+'"><tbody>');
//go through products
$.each( productObject, function( productId, product ) { j++;
$('.table-'+categoryName+'').append('<tr><td>'+product.name+'<br/><small>'+product.description+'</small></td><td>€'+product.price+'</td><td><a onclick="addToCart("' + productId + '");" class="btn btn-primary pull-right" href="#">Add</a></td></tr>');
});
// close table
$('.live-menu-content').append('</tbody></table>');
});
})
// on fail
.fail(function() {
alert( "Error!" );
});
return false;
}
function addToCart(productId){
var product = store.filter(function(category, catIndex){
return category.filter(function(product, prodIndex){
return (prodIndex == productId);
});
});
console.log(product);
return false;
};
var存储;
函数openMenu(url){
//从API获取提要
$.getJSON(url、函数(storedata){
store=storedata;//分配给全局对象
$(“#实时菜单”).addClass(“活动”);
$('.live菜单内容').addClass('active');
//每个人都需要输入数据
$.each(存储数据、函数(categoryName、productObject){
//类别标题和打开表
$('.live菜单内容')。追加(''+categoryName+'');
$('.live菜单内容')。附加('');
//检查产品
$.each(productObject,function(productId,product){j++;
$('.table-'+categoryName+'').append(''+product.name+'
'+product.description+'欧元'+product.price+'');
});
//闭桌
$('.live菜单内容')。附加('');
});
})
//失败时
.fail(函数(){
警报(“错误!”);
});
返回false;
}
函数addToCart(productId){
var product=store.filter(函数(类别,catIndex){
退货类别.过滤器(功能(产品,产品索引){
返回(prodIndex==productId);
});
});
控制台日志(产品);
返回false;
};
感谢您的快速回复。只传递productId的问题在于,由于名称、描述和定价不同,数据需要像进入菜单时一样存储在购物车中。如果我也能将这些传递给函数,它就会得到解决,定价似乎不成问题,但名称也给了我“未定义”。有什么想法吗?那么您是否正在执行另一个ajax调用以获取更新的数据?这是在哪里发生的?如果是,您不能用更新的数据更新全局store
对象吗?产品id不会更改,是吗?“购物车”将在购物车“签出”后发布到API,这将在稍后发生。数据不应更新,并且仍然必须按“订单”中的原样显示,无论价格或名称发生什么变化,只有ID将作为产品的参考。我尝试过这样做:addToCart(“+productId+”,“+product.name+”);但是当我使用console.log时,它只会给我一个错误:“testproduct未定义”:我太愚蠢了,我不得不更改:addToCart(“+productId+”,“+product.name+”);添加到目录(“+productId+”,\“+product.name+”\);当然……:)