使用 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 属性。
我有一个显示对象列表的 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 属性。