javascript - Knockout - 如何一起使用 option 和 foreach 绑定(bind)

标签 javascript jquery knockout.js

我有一个来自服务器的ajax数据,我应该用这个数据生成选择框。 请看this code :

var dataCameFromServer = {
  foo: "1",
  bar: "sag",
  results: [
    {
      slectedBoxID: null,
      selectBoxOptions: [
        {
          id: 1,
          name: "mosi"
        },
        {
          id: 2,
          name: "azi"
        },
        {
          id: 3,
          name: "mom"
        },
        {
          id: 4,
          name: "dad"
        }
      ]
    },
    {
      slectedBoxID: 2,
      selectBoxOptions: [
        {
          id: 1,
          name: "tehran"
        },
        {
          id: 2,
          name: "masal"
        },
        {
          id: 3,
          name: "gilan"
        },
        {
          id: 4,
          name: "rasht"
        }
      ]
    },
    {
      slectedBoxID: 1,
      selectBoxOptions: [
        {
          id: 1,
          name: "adidas"
        },
        {
          id: 2,
          name: "nike"
        },
        {
          id: 3,
          name: "rebook"
        },
        {
          id: 4,
          name: "puma"
        }
      ]
    }
  ]
};

function selectViewModel() {
  var self = this;
  this.data = ko.observable(dataCameFromServer);
  this.sbValue = ko.observableArray();
  ko.computed(function() {
    $.each(self.data().results, function(i,v) {
      self.sbValue.push(v.slectedBoxID);
    });
  });
  ko.computed(function(){
  console.log(self.sbValue());
});
}


ko.applyBindings(new selectViewModel(), $("#wrapper")[0]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<div id="wrapepr">
  <!-- ko with: data -->
  <!-- ko foreach : results -->
  <select data-bind="options:selectBoxOptions,optionsText: 'name',optionsValue: 'id',value: $root.sbValue()[$index],optionsCaption: 'Choose...'"></select>
  <!-- /ko -->
  <!-- /ko -->
</div>

我希望默认情况下由 slectedBoxID 中的选项选择我的选择框,如果我的选择框发生更改,则相应 slectedBoxID 的值也会更改。

有什么建议吗?

p.s:我不知道服务器端有多少结果,不只是这三个结果!

最佳答案

最简单的方法是使用 ko.mapping插件

或者您可以手动使每个数组对象属性可观察。

var dataCameFromServer = { foo: "1", bar: "sag", results: [{ slectedBoxID: null, selectBoxOptions: [{ id: 1, name: "mosi" }, { id: 2, name: "azi" }, { id: 3, name: "mom" }, { id: 4, name: "dad" } ] }, { slectedBoxID: 2, selectBoxOptions: [{ id: 1, name: "tehran" }, { id: 2, name: "masal" }, { id: 3, name: "gilan" }, { id: 4, name: "rasht" } ] }, { slectedBoxID: 1, selectBoxOptions: [{ id: 1, name: "adidas" }, { id: 2, name: "nike" }, { id: 3, name: "rebook" }, { id: 4, name: "puma" } ] } ] };

function selectViewModel() {
  var self = this;
  // using ko.mapping 
  this.data = ko.mapping.fromJS(dataCameFromServer);
  this.sbValue = self.data.results().map(v => v.slectedBoxID);
}

ko.applyBindings(new selectViewModel(), $("#wrapper")[0]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.min.js"></script>
<div id="wrapepr">
  <!-- ko with: data -->
  <!-- ko foreach: results -->
  <select data-bind="options:selectBoxOptions,optionsText: 'name',optionsValue: 'id',value: slectedBoxID,optionsCaption: 'Choose...'"></select>
  <!-- /ko -->
  <!-- /ko -->
</div>
<pre data-bind="text: ko.toJSON(sbValue, null, 2)"></pre>

关于javascript - Knockout - 如何一起使用 option 和 foreach 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43825346/

相关文章:

javascript - 通过 fetch() 调用 API - 输入意外结束

javascript - 谷歌地图 HTML/JavaScript 不显示

asp.net - 如何检查文件是否准备好?

javascript - 检测点击了哪个元素

javascript - 如何拆分和分配 2 个单词?

javascript - 根据所选偏好匹配数据

javascript - jQuery JavaScript 数据表列压缩/挤压在一起

html - 在 Knockoutjs 中获取 foreach 别名的索引

knockout.js - 如何在使用 knockout 绑定(bind)的值周围加上括号?

html - 使用 HTML 属性进行 knockout validation