将动态表转换为数组

时间:2019-01-13 16:59:29

标签: javascript jquery meteor spacebars

我有一个动态更新的表(感谢那些上次发布/订阅查询的人),我想将每个更新行的数据存储到一个数组中,然后将其插入到mongodb集合中。我的表如下:

<template name="choral">
<div class="container" style="padding-top: 25px">
  <div class="table-responsive">
    <form id="orderForm">
    <table id ="productList" class="table table-borderless table-dark">
      <thead class="thead-light">
        <tr>
            <th>Title:</th>
            <th>See the Music:</th>
            <th>Hear the Music:</th>
            <th>Format:</th>
            <th>Price (per copy):</th>
            <th>Quantity:</th>
        </tr>
      </thead>
      <tbody>
         {{#each pieces}}
        <tr id="itemList">
            <td id="name">{{name}}</td>
            <td id="pdf">PDF</td>
            <td id="audio">AUDIO</td>
            <td id="format">FORMAT</td>
            <td id="price">{{score}}</td>
            <td id="qty"><input type ="number" name ="quantity"></td>
        </tr>
        {{/each}}
      </tbody>
      <tfoot>
            <tr>
                <td colspan="5"></td>
                <td><button id ="#addItems" class="button" type ="submit">Add to Cart</button></td>
            </tr>
        </tfoot>
  </table>
  </form>
  </div>
</div>  

我想从表主体的每一行中提取数据,并将动态数据存储到数组中。像这样的东西:

Template.choral.events({
'click #addItems': function(e){
    e.preventDefault();
    var cartItem =[];

    $('#itemList tr').each(function(){
        var item = [];
        var name = $('#name',this).val();
        var price = $('#price',this).val();
        var qty = $('#qty',this).val();
            item.push({name, price, qty});
            cartItem.push([item]);
    });
    console.log(cartItem)
}

});

我不知道当通过对助手的空格键调用填充表格时,或者甚至有效使用.each()时,这种想法是否可行。最终,这些查询的最终结果应为:

cartItems [{name1, price1, qty},{name2, price2, qty}]

1 个答案:

答案 0 :(得分:2)

首先,不要在生成的HTML中产生相同的id属性-这是无效的。改为使用class,如下所示:

    {{#each pieces}}
    <tr class="itemList">
        <td class="name">{{name}}</td>

...等等

第二,jQuery选择器$('#itemList tr')没有选择任何内容,因为#itemList不包含任何tr后代,而是本身 em> tr。因此,与前一个备注一起,选择器应为$('tr.itemList')

然后,在jQuery代码中按类属性(使用.进行选择,并在this上下文中进行操作,因此仅在当前行中进行匹配:

var cartItem =[];

$('tr.itemList').each(function() {
    var name = $('.name', this).val();
    var price = +$('.price', this).val(); // convert to number?
    var qty = +$('.qty', this).val(); // (idem)
    var item = {name, price, qty}; // just assign to item
    cartItem.push(item); // don't use square brackets here
});

您可能希望将价格和数量转换为数字。在这种情况下,请使用一元+(请参见上文)。

我不认为您希望item是一个数组,而只希望具有三个属性的对象。

还请注意push参数中的修复程序。