Knockout JS:获取所选数据的下拉列表并填充其他字段

时间:2018-03-14 18:37:40

标签: javascript jquery knockout.js

在这里使用Knockout JS。

我有一个HTML表格,表格有4列。我有按钮向表中添加一行,然后删除每行的按钮以删除它。我还在此表的第一列中有一个下拉列表。下拉列表从表格外的按钮单击事件填充。以下是我的HTML:

   <table class="table table-bordered">
    <thead class="mbhead">
      <tr class="mbrow">
       <th>Input</th>
       <th>First Name</th>
       <th>Last Name</th>
        <th>Address</th>
      </tr>
    </thead>
 <tbody data-bind="foreach: items">
<tr>
  <td>
    <select class="form-control" data-bind="options: $parent.ddl, optionsText: 'name', value: $parent.selectedColumnValue, optionsCaption: '--Select--',  event: { change: $parent.ddlChanged }">                          
                    </select>
  </td>
  <td><span class="input-small" data-bind="value: firstName" /></td>
  <td><span class="input-small" data-bind="value: lastName" /></td>
  <td><span class="input-small" data-bind="value: address" /></td>
  <td>
    <input type="button" value="Remove Row" data-bind="click: $parent.removeRow" class="btn btn-danger" />
  </td>
</tr>
</tbody>
</table>

<div class="col-xs-12 col-sm-6">
  <input type="button" value="Add Row" class="btn btn-primary" data-bind="click: addRow" />
 <input type="submit" value="Get Data" data-bind="click: GetData" class="btn btn-primary" />
</div>

我的淘汰代码可以在jsfiddle链接中看到,如下所示。

我在寻找的是:

当用户选择下拉列表时,所选下拉文本将填充到该行一列,并且该值将填充到该行的其他列/单元格。

我的问题:

1。)我无法从下拉列表中获取所选文本和选定值

当下拉选择索引更改事件被触发时,事件参数具有以下值,如控制台中所示:

  

firstName:ƒc()

     

lastName:ƒc()

     

地址:ƒc()

     

proto :对象

2.)其次我不知道如何根据下拉选择更新其他列值。

被绑定到下拉列表的json如下所示:

'[{"FirstName":"Alex","LastName":"Sanders","Address":123},{"FirstName":"Sam","LastName":"Billings","Address":"Mahony Street"}]';

这是我的小提琴:

https://jsfiddle.net/aman1981/njbyumrs/12/

赞赏输入。

1 个答案:

答案 0 :(得分:3)

您已将某些父级和级别内容混淆,并且您的表格在value而不是text上具有约束力。我将下拉绑定selectedValue移动到Item,因为它位于行级别而不是父级别。我使用KO with绑定来显示HTML中该部分的selectedValue内的值。

我还添加了一个带有KO值的<pre>标记,这样您就可以看到与它交互时发生的情况以及KO模型数据的变化。

附注:Item中的三个属性不需要在此演示中观察到,因为屏幕上的值不会改变。

&#13;
&#13;
var ViewModel = function() {
  var self = this;

  //Empty Row
  self.items = ko.observableArray([new Item()]);
  self.ddl = ko.observableArray();  

  self.addRow = function() {
    self.items.push(new Item());
  };

  self.removeRow = function(data) {
    self.items.remove(data);
  };
  self.GetData = function() {
    if (self.ddl().length === 0) {
      var item1 = new Item("Alex", "Sanders", "Maple Street");
      self.ddl.push(item1);
      var item2 = new Item("Sam", "Billings", "Mahony Street");
      self.ddl.push(item2);
    }
  }
}

var Item = function(fname, lname, address) {
  var self = this;
  self.firstName = ko.observable(fname);
  self.lastName = ko.observable(lname);
  self.address = ko.observable(address);
  self.selectedValue = ko.observable();
};

vm = new ViewModel()
vm.GetData();
ko.applyBindings(vm);
&#13;
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<table class="table table-bordered">
  <thead class="mbhead">
    <tr class="mbrow">
      <th>Input</th>
      <th>First Name</th>
      <th>Last Name</th>
      <th>Address</th>
    </tr>
  </thead>
  <tbody data-bind="foreach: items">
    <tr>
      <td><select class="form-control" data-bind="options: $parent.ddl, optionsText: 'firstName', value: selectedValue, optionsCaption: '--Select--'"> </select></td>
      <td data-bind="with: selectedValue">
        <span data-bind="text: firstName"></span>
      </td>
      <td data-bind="with: selectedValue">
        <span data-bind="text: lastName"></span>
      </td>
      <td data-bind="with: selectedValue">
        <span data-bind="text: address"></span>
      </td>
      <td>
        <input type="button" value="Remove Row" data-bind="click: $parent.removeRow" class="btn btn-danger" />
      </td>
    </tr>
  </tbody>
</table>

<div class="col-xs-12 col-sm-6">  
  <input type="button" value="Add Row" class="btn btn-primary" data-bind="click: addRow" />
</div>

<pre data-bind="text: ko.toJSON($data, null, 2)"></pre>
&#13;
&#13;
&#13;