javascript - 使用从数据库中填充的选择动态生成表单行

标签 javascript php laravel

这是我的困境。在 Laravel 中,我正在通过 inspections像这样的 View :

$inspections = Inspection::where("status", "!=", "started")->get();
return View::make('process')->with("inspections", $inspections);

检查包含通过启动阶段的所有检查的列表。在 View 中,我正在创建一个表单来处理这些检查,如下所示:

<tr id="row_0" data-row="0">
  <td>
    <select class="form-control input-sm" name="inspection[0]">
      <option value=""></option>
      @foreach($inspections AS $inspection)
      <option value="{{ $inspection->id }}">{{ $inspection->submission_number }} - {{ $inspection->policy_number }} - {{ $inspection->location_address }}</option>
      @endforeach
    </select>
  </td>
  <td><label class="radio-inline"><input type="radio" name="received[0]" value="yes" >Yes</label><label class="radio-inline"><input type="radio" name="received[0]" value="no" >No</label></td>
  <td><label class="radio-inline"><input id="i_on_0" type="radio" name="invoiced[0]" value="yes" onclick="toggleInvoice(this);" data-row="0"/>Yes</label><label class="radio-inline"><input id="i_off_0" type="radio" name="invoiced[0]" value="no" onclick="toggleInvoice(this);" data-row="0"/>No</label></td>
  <input type="hidden" id="in_0" name="invoice_number[0]" disabled/>
  <td><input type="text" id="ia_0" name="invoice_amount[0]" class="form-control input-sm" disabled/></td>
  <td><label class="radio-inline"><input type="radio" id="p_on_0" name="paid[0]" value="yes" disabled/>Yes</label><label class="radio-inline"><input type="radio" id="p_off_0" name="paid[0]" value="no" disabled/>No</label></td>
</tr>

这会创建以下内容:

Capture

这很好,但我不知道如何将另一行追加到该表中,并且仍然显示每个选项的值。现在,我的 + 按钮在 Javascript 中调用以下函数:

function appendProcessingRow(){
  var current_row = $("#processing_table tr:last").attr("data-row");
  var content = '<tr id="row_' + (parseInt(current_row) + 1) + '" data-row="' + (parseInt(current_row) + 1) + '"><td><input type="text" name="policy_number[' + (parseInt(current_row) + 1) + ']" class="form-control input-sm"/></td><td><label class="radio-inline"><input type="radio" name="received[' + (parseInt(current_row) + 1) + ']" value="yes">Yes</label><label class="radio-inline"><input type="radio" name="received[' + (parseInt(current_row) + 1) + ']" value="no"> No</label></td><td><label class="radio-inline"><input type="radio" name="invoiced[' + (parseInt(current_row) + 1) + ']" value="yes" onclick="toggleInvoice(this);" data-row="' + (parseInt(current_row) + 1) + '"/> Yes</label><label class="radio-inline"><input type="radio" name="invoiced[' + (parseInt(current_row) + 1) + ']" value="no" onclick="toggleInvoice(this);" data-row="' + (parseInt(current_row) + 1) + '"/> No</label></td><input type="hidden" id="in_' + (parseInt(current_row) + 1) + '" name="invoice_number[' + (parseInt(current_row) + 1) + ']" disabled/>><td><input type="text" id="ia_' + (parseInt(current_row) + 1) + '" name="invoice_amount[' + (parseInt(current_row) + 1) + ']" class="form-control input-sm" disabled/></td><td><label class="radio-inline"><input type="radio" id="p_on_' + (parseInt(current_row) + 1) + '" name="paid[' + (parseInt(current_row) + 1) + ']" value="yes" disabled/> Yes</label><label class="radio-inline"><input type="radio" id="p_off_' + (parseInt(current_row) + 1) + '" name="paid[' + (parseInt(current_row) + 1) + ']" value="no" disabled/> No</label></td></tr>';
  $('#processing_table > tbody:last').append(content);
}

这有效,但会创建一个 <input>标签而不是选择选项。请参阅以下内容:

Capture2

我的问题是,如何在 Javascript 中创建相同的行布局,请记住选择是由 @foreach 生成的。在拉维尔?尝试放置:

<select class="form-control input-sm" name="inspection[0]">
  <option value=""></option>
  @foreach($inspections AS $inspection)
  <option value="{{ $inspection->id }}">{{ $inspection->submission_number }} - {{ $inspection->policy_number }} - {{ $inspection->location_address }}</option>
  @endforeach
</select>

Javascript 内部 appendProcessingRow()它在一定程度上“有效”,但值(value)不存在:

Capture3

因此,任何帮助将不胜感激。预先感谢,很抱歉这篇文章很长。

最佳答案

如果不使用“完整的ajax”从服务器获取选项,我认为克隆现有行是最简单的方法。

function appendProcessingRow(){
    var lastRow = $("#processing_table tr:last");
    var newRow = lastRow.clone();
    var newId = parseInt(lastRow.data('row'))+1;
    newRow.data('row', newId);
    newRow.prop('id', newId);
    newRow.find('select').prop('selectedIndex', 0);

    // reset other inputs in a similar fashion

    lastRow.after(newRow);
}

还有关于您的输入名称...您应该能够像 policy_number[] 一样保留它们,而无需索引。它会自动将值放入数组中(按照它们在 html 中出现的顺序)

关于javascript - 使用从数据库中填充的选择动态生成表单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27533120/

相关文章:

javascript - do while 循环在 Titanium 中无法正常工作

Javascript OOP : should methods be enumerable?

javascript - 使用从函数返回的字符串选择预定义变量

java - AsyncHttpResponseHandler 未定义发送参数;RequestParams、android、java、php

javascript - 以仅提供 src 属性的 iframe 为目标

php - Mysql group by 并计算单独列上的尝试

php - 为什么我无法将数据从 Modal 发送到 PHP?

php - laravel 中的时间戳不会更新

php - 在 Laravel 中为多行插入中的字段设置固定值

javascript - 如何在 ajax header 中为每个用户发送 api token ?