Data binding js数据绑定下拉列表值到数组索引-可能吗? 函数MyViewModel(){ var self=这个; this.addPerson=函数(){ this.PersonIdList.push(0); } this.showSecondSection=ko.computed(函数(){ //这里需要逻辑吗? },这个); this.PersonIdList=ko.observearray(); this.PeopleChoices=ko.array([ { “Id”:1, “姓名”:“个人A” }, { “Id”:2, “姓名”:“B人” }, { “Id”:3, “姓名”:“C人” }, ); } 你好

Data binding js数据绑定下拉列表值到数组索引-可能吗? 函数MyViewModel(){ var self=这个; this.addPerson=函数(){ this.PersonIdList.push(0); } this.showSecondSection=ko.computed(函数(){ //这里需要逻辑吗? },这个); this.PersonIdList=ko.observearray(); this.PeopleChoices=ko.array([ { “Id”:1, “姓名”:“个人A” }, { “Id”:2, “姓名”:“B人” }, { “Id”:3, “姓名”:“C人” }, ); } 你好,data-binding,knockout.js,Data Binding,Knockout.js,我想知道是否可以将此块数据绑定到PersonIdList中的项目? 另外,我是否可以在循环中创建第二个div容器,如果Id=3,则该容器在条件下可见。如果我理解正确,您有一个绑定到foreach的可观察Id数组。在每个中,您都有一个选择选项列表(下拉列表)绑定到PeopleChoices数组。并且要将PersonID的当前迭代绑定到下拉列表的值 我不确定你想要的结果是什么,或者你为什么要这样做。这是可能的,有点。我不确定当在下拉列表中选择一个新选项时会发生什么。我猜不会发生任何事情,也不会发生任

我想知道是否可以将此块数据绑定到PersonIdList中的项目?
另外,我是否可以在循环中创建第二个div容器,如果Id=3,则该容器在条件下可见。

如果我理解正确,您有一个绑定到foreach的可观察Id数组。在每个
中,您都有一个选择选项列表(下拉列表)绑定到PeopleChoices数组。并且要将PersonID的当前迭代绑定到下拉列表的值

我不确定你想要的结果是什么,或者你为什么要这样做。这是可能的,有点。我不确定当在下拉列表中选择一个新选项时会发生什么。我猜不会发生任何事情,也不会发生任何事情。下面是答案

您只需将值绑定设置为
$data
,如下所示:

function MyViewModel() {
  var self = this;
  this.addPerson = function () {
    this.PersonIdList.push(0);
  }

  this.showSecondSection = ko.computed(function() {
    // need logic here?
  }, this);

  this.PersonIdList = ko.observableArray();
  this.PeopleChoices = ko.observableArray([
    {
      "Id": 1,
      "Name": "Person A"
    },
    {
      "Id": 2,
      "Name": "Person B"
    },
    {
      "Id": 3,
      "Name": "Person C"
    },
  );
}


<!-- ko foreach: PersonIdList -->
<div class="container" style="margin-bottom: 5px;">                
  <select id="idList" data-bind="options: $root.PeopleChoices, optionsValue: 'Id', optionsText: 'Name', optionsCaption: '-- Please Select --', value: ??"></select>                                                             
</div> 
<div data-bind="visible: showSecondSection">Hi</div>
<!-- /ko -->
<a href="javascript:void(0);" data-bind="click: addPerson">Add person</a>

在personIdList的每次迭代中,$数据设置了所选的值,但是一旦你改变了选择,什么都不会发生,因为observableArray中充满了静态数据。所以我想,如果它们是可观察的呢?所以我更新了,我想它至少会更新可观察的值,但它没有

是的,你可以,但这很奇怪。不知道你为什么要这么做

更新:可以这样做。

Adam,我认为这是一个更干净的解决方案,你可以使用Observable,你也可以在需要的时候使用showValue这样的属性来显示跨度。这更多的是你应该如何在Knockout中使用Observable,当你在JavaScript中使用这样强大的对象时,你不想依赖索引

<select id="idList" data-bind="options: $root.PeopleChoices, optionsValue: 'Id', optionsText: 'Name', optionsCaption: '-- Please Select --', value: $data"></select>

所选人员的姓名为:
天哪,第二个人出现了!

我不理解你的问题,你有一个数组,你正在正确绑定它,它正在按照你想要的方式显示和操作,那么确切的问题是什么呢?当我使用调试工具时,它不会显示数组中数据绑定值的变化。只需让数组的属性可见即可。然后你就不需要索引或属性任何与答案类似的内容都会显示出来。是的,没错。谢谢!现在,我该如何根据上面的selectlist中id的值编写showSecondSection方法?很高兴您找到了答案,请注意,虽然这确实起到了作用,但在Knockout observableArrays中使用索引并不是“正确”的方法,因为您可以轻松地将列表排序为a然后索引就不再重要了。请注意,在你的小提琴中,数字在页面上没有改变。我认为它的数据绑定不正确。但我看到它们在第二个中!所以我只是尝试了一下,它按照我希望的方式工作。因此,如果没有,我将如何使用ko.computed显示第二个部分Id仅设置为3?基本上我需要将当前数组索引传递给ko.computed,不是吗?第二部分的答案是我创建了一个对象,并将其传递到数组中,而不是原始值。您的答案让我明白了,Dennis。这是一个演示可见部分的示例,尽管这是一个“脏”修复。我不喜欢看到函数调用或绑定中的比较,因此我可能会添加一个专用的observable,以便在订阅“id”observable属性时进行更新。在这种情况下,这对我来说更有意义。很高兴您能够从我的代码示例中了解到这一点。感谢您的回答,但这不起作用,因为当您更改任何单个下拉列表时,所有其他人也会改变。显然,您必须根据您的项目定制答案,但这是正确的处理方法。使用索引不是正确的方法。
<div data-bind="with: selectedPerson">
The name of the person that is selected is : <span data-bind="text: Name"></span>
<h4 data-bind="visible: ShowHighlight">OMG SECOND PERSON IS SHOWN!</h4>
</div>