使用 knockout.js 在 select 上更新具有值绑定的整个对象?

Update entire object with value binding on select with knockout.js?

我有一个显示对象列表的 select 下拉菜单,name 属性 是显示的文本,id 属性作为每个选项绑定到的值,以及来自另一个对象上的单独 属性 的 value: user.id 绑定。

<td data-bind=""><select data-bind="options: peopleResponsible, optionsText: 'name', optionsValue: 'id', value: user.id"></select></td>

当我从下拉列表中 select 一个新的人物对象时,只有 user 上的 id 正在更新。所有其他属性(姓名、用户名、年龄等)都不会更新。

我需要它做的是当一个新的 peopleResponsible 选项被 selected 时,我希望它复制 所有 的属性从该对象到 user 对象。

我怀疑目前它无法正常工作,因为 user 对象本身是不可观察的,只有它的属性是可观察的。以下是我的数据的映射方式:

ko.mapping.fromJS(taskOutlines, {}, mappedTaskOutlines);

其中一个 TaskOutline 包含多个 Tasks,每个 Task 包含一个 User

有什么想法吗?

value 绑定只设置一个可观察对象。不知道东西是怎么用的,很难说你应该怎么做才能得到你想要的结果。一种可能性是制作一个函数,将 subscribe 复制到 user.id

你可以这样做:

var vm = {
  peopleResponsible: ko.observableArray([{
    id: ko.observable(1),
    name: ko.observable("p1")
  }, {
    id: ko.observable(2),
    name: ko.observable("p2")
  }, {
    id: ko.observable(3),
    name: ko.observable("p3")
  }]),
  selectedUser: ko.observable()
}

vm.selectedUser(vm.peopleResponsible()[1]); // pre select a user

ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>



<select data-bind="options: peopleResponsible, optionsText: 'name', value: selectedUser"></select>
<div data-bind="with: selectedUser">
  <p>Id:
    <label data-bind="text: id"></label>
  </p>
  <p>Name:
    <label data-bind="text: name"></label>
  </p>
</div>

进行选择后,该选择将是对可观察数组、属性和所有对象中任意对象的引用。这个选定的对象将被放置在 "selectedUser" observable.

简而言之,删除 "optionsValue" 绑定将绑定整个对象而不是 id 属性。