2017-02-22 66 views
0

我想将一个产品对象从$ .each(函数内)循环传递给闭包外的函数。

当我CONSOLE.LOG产品(对象),它给了我:

“未捕获的ReferenceError:产品没有定义”

这里是我的代码,请告诉我,我错过了什么:

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; 
    }; 

回答

0

我认为你意识到这一点,但你的product只在你的each功能范围内定义。并且该产品用于呈现DOM元素。而不是呈现您的实际产品,而是呈现文字字符串“product”,该字符串不存在于循环范围之外。当单击DOM元素时,单击事件处于完全独立的范围内。你可以把产品的id传递给函数吗?然后在处理函数中查找产品?您还需要创建一个全局的store对象以供日后参考:

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; 
    }; 
+0

感谢您的快速回复。仅传递productId的问题是,由于名称,描述和定价不同,数据需要在进入菜单时按原样存储在购物车中。 如果我可以将这些通过函数传递给函数,并且它会被解决,定价似乎不是问题,但名称也给我“未定义”。任何想法? – user3058125

+0

那么你是否正在执行另一个Ajax调用以获取更新的数据?这发生在哪里? –

+0

如果你是,你不能只更新全球'商店'对象与更新的数据?产品ID不会改变,是吗? –

相关问题