【问题标题】:passing an object in (multidimensional) $.each to function outside of closure将(多维)$.each 中的对象传递给闭包之外的函数
【发布时间】:2017-07-13 04:33:57
【问题描述】:

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

当我控制台记录产品(对象)时,它给了我:

“未捕获的引用错误:未定义产品”

这是我的代码,请告诉我我缺少什么:

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

【问题讨论】:

    标签: javascript jquery loops multidimensional-array each


    【解决方案1】:

    我认为您意识到这一点,但您的 product 仅在您的 each 函数范围内定义。该产品用于渲染 DOM 元素。而不是呈现您的实际产品,它正在呈现文字字符串“产品”,它不存在于您的循环范围之外。当点击 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;
      };
    

    【讨论】:

    • 感谢您的快速回复。仅传递 productId 的问题在于,由于名称、描述和定价不同,数据需要在进入菜单时按原样存储在购物车中。如果我也可以将这些传递给函数,它就会得到解决,定价似乎不是问题,但这个名字也给了我“未定义”的意思。有什么想法吗?
    • 那么您是否正在执行另一个 ajax 调用来获取更新的数据?这是在哪里发生的?
    • 如果你是,你不能用更新的数据更新全局store对象吗?产品 ID 不会改变,是吗?
    • “购物车”将在购物车“结帐”时发布到 API,这将在稍后发生。数据不应更新,并且无论价格或名称如何更改,仍必须按原样在“订单”中显示,只有 ID 将是产品的参考。我试过这样做: addToCart(' + productId + ', '+product.name+');但它只会给我一个:“testproduct is not defined”当我控制台记录它时出错
    • 啊,我多么愚蠢,我不得不改变: addToCart(' + productId + ', '+product.name+'); addToCart(' + productId + ', \'' + product.name + '\');当然... :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2014-11-19
    相关资源
    最近更新 更多