首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用可剔除的可观测数组同步jquery选择菜单

用可剔除的可观测数组同步jquery选择菜单
EN

Stack Overflow用户
提问于 2016-05-17 17:45:44
回答 1查看 241关注 0票数 0

也许这样做是错误的,但是我有一个html表,它使用一个使用foreach的可剔除的可观测数组填充。每一行我都有一个下垂。我喜欢jquery选择菜单,所以我使用它。不幸的是,当您运行小提琴时,您会注意到在更新下拉列表时,没有更新相应的敲除选定值。

这是小提琴,https://jsfiddle.net/8rw4ruze/3/,这是html。

代码语言:javascript
复制
<table class="table  table-condensed table-responsive">
  <thead>
    <th>id</th>
    <th>animal</th>
    <th>Selected Value</th>
  </thead>
  <tbody data-bind="foreach: tableRows">
    <tr>
      <td data-bind="text: id"></td>
      <td>
        <select class="form-control" data-bind="options: recordList,
                     optionsText: 'desc',
                     optionsValue: 'val',
                     value: selectedVal,
                     attr: {id:  selectId}">

        </select>
      </td>
      <td data-bind="text: selectedVal"></td>
    </tr>
  </tbody>
</table>

这是javascript

代码语言:javascript
复制
function record(val, desc) {
  var self = this;
  this.val = ko.observable(val);
  this.desc = ko.observable(desc);
}

function tableRow(id, recordList) {
  var self = this;
  this.id = ko.observable(id);
  this.recordList = ko.observable(recordList)
  this.selectedVal = ko.observable('A');
  this.selectId = ko.computed(function() {
    return 'mySelect' + self.id()
  }, this);
}

function Model() {
  var self = this;
  this.records = ko.observableArray("");
  this.tableRows = ko.observableArray("");
}

var mymodel = new Model();

$(function() {

  mymodel.records.push(new record('A', 'ant'));
  mymodel.records.push(new record('B', 'bird'));
  mymodel.records.push(new record('C', 'cat'));
  mymodel.records.push(new record('D', 'dog'));
  mymodel.tableRows.push(new tableRow(1, mymodel.records()));
  mymodel.tableRows.push(new tableRow(2, mymodel.records()));
  mymodel.tableRows.push(new tableRow(3, mymodel.records()));
  mymodel.tableRows.push(new tableRow(4, mymodel.records()));


  ko.applyBindings(mymodel);

    for (var i = 0; i < 4; i++) {
    var id = '#mySelect' + (i + 1)
    $(id).selectmenu({
      width: 125,
      change: function(event, ui) {
        var newVal = $(this).val();
        mymodel.tableRows()[i].selectedVal(newVal);
      }
    });
  }


});

谢谢,我带了一个数据属性。我更喜欢使用自定义绑定,但我还不够聪明,无法解决这个问题,所以我就这样做了。

代码语言:javascript
复制
for (var i = 0; i < 4; i++) {
    var id = '#mySelect' + (i + 1)
    $(id).selectmenu({
      width: 125,
      change: function(event, ui) {
        var newVal = $(this).val();
        var index = $(this).data( "index" );
        mymodel.tableRows()[index].selectedVal(newVal);
      }
    }).data( "index", i );
  }

这是小提琴https://jsfiddle.net/8rw4ruze/7/

我想我让它在这里使用自定义绑定--它是https://jsfiddle.net/8rw4ruze/8/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-17 21:28:01

Matt.k是正确的,当它被使用时,你的I的价值不是你想要的那样。一种方法是使用这个循环,而不是简单的for

代码语言:javascript
复制
$('select').each(function (i, e) {
  e.selectmenu({
    width: 125,
    change: function(event, ui) {
      var newVal = $(this).val();
      mymodel.tableRows()[i].selectedVal(newVal);
    }
  });
});

这有点脆弱,因为它依赖于ie来正确地对应。一种更健壮的方法(在Knockout中也是典型的)是使用绑定处理程序,这将允许您指定绑定并让Knockout遍历元素并进行必要的调用。令人惊讶的是,一个小小的网络搜索并没有为我打开一个。

我看到有一个github上的淘汰制-jqueryui项目,它也为您提供了一种干净的使用所需小部件的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37283067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档