Knockout.js设置选择对象的选项
我正在进行我的第一个淘汰赛项目,努力找出处理这种情况的最佳方法 希望这个简化的例子能达到目的 我正在尝试编辑一个具有“employee”属性的“project”对象Knockout.js设置选择对象的选项,knockout.js,Knockout.js,我正在进行我的第一个淘汰赛项目,努力找出处理这种情况的最佳方法 希望这个简化的例子能达到目的 我正在尝试编辑一个具有“employee”属性的“project”对象 function Project(data) { var self = this; self.Name = data.Name; self.Employee = data.Employee; } function Employee(data) { var self = this; self.
function Project(data) {
var self = this;
self.Name = data.Name;
self.Employee = data.Employee;
}
function Employee(data) {
var self = this;
self.ID = data.ID;
self.Name = data.Name;
}
我首先加载我的项目,然后设置“selectedEmployee”
var me = new Employee ({ ID: 1, Name: 'Aaron'});
function vm() {
var self = this;
self.Project = ko.observable(new Project({ Name:'Knockout', Employee:me}));
self.selectedEmployee = ko.observable(self.Project().Employee);
self.employees = ko.observableArray([
new Employee ({ID: 1,Name: 'Aaron'}),
new Employee ({ID: 2,Name: 'George'}),
new Employee ({ID: 3,Name: 'Ross'})
]);
}
ko.applyBindings(vm);
我有一个下拉列表,其中包含员工列表:
<select data-bind="options: employees, optionsText: 'Name',value: selectedEmployee, optionsCaption:'Pick Employee'"></select>
那么,让项目中的“员工”与下拉列表中的内容匹配的最佳实践是什么?加载Employee对象时,是否需要从“employees”(基于ID)列表中检索该对象
我尝试为EmployeeName(显示值[只读]时使用)和EmployeeID(从列表中选择时使用)使用可观察属性,但EmployeeName没有更新
似乎应该有一个简单的方法来做到这一点,但正如我所说,这是我的第一个淘汰项目
这是我的
提前谢谢。好的,我将提供我根据@nemesv的评论得出的答案 这是我的HTML。请注意,我正在将
选项设置为对象数组。options文本
和options值
属性按照您的预期进行设置。我的自定义绑定selectById
设置为我的视图模型中的选定对象
<select data-bind="options: employees,
optionsText: 'Name',
optionsValue: 'ID',
selectById: selectedEmployee,
optionsCaption:'Pick Employee'">
</select>
<br><br>
Selected Employee:
<span data-bind="text: ko.toJSON(selectedEmployee)"></span>
我毫不怀疑此解决方案可以改进,请随意传递更好的解决方案/提示。坦白地说,我认为这种选项应该加入到Knockout中。您需要像send示例中那样执行by-id查找。或者您可以像这样使用定制的检查绑定:在这里您可以提供一个比较函数
<select data-bind="options: employees,
optionsText: 'Name',
optionsValue: 'ID',
selectById: selectedEmployee,
optionsCaption:'Pick Employee'">
</select>
<br><br>
Selected Employee:
<span data-bind="text: ko.toJSON(selectedEmployee)"></span>
function Project(data) {
var self = this;
self.Name = data.Name;
self.Employee = data.Employee;
}
function Employee(data) {
var self = this;
self.ID = data.ID;
self.Name = data.Name;
}
ko.bindingHandlers.selectById = {
init: function (element, valueAccessor, allBindings) {
$(element).change(function() {
var emps = ko.unwrap(allBindings.get('options'));
var newSelectedValue = $(element).find("option:selected").val();
var va = valueAccessor();
if (!!newSelectedValue) {
va(ko.utils.arrayFirst(emps, function(item) { return item.ID == newSelectedValue }));
}
else va(null);
});
},
update: function (element, valueAccessor) {
var selectedItem = ko.unwrap(valueAccessor());
$(element).val(selectedItem ? selectedItem.ID : '');
}
}
var me = new Employee({ ID: 1, Name: 'Aaron' });
function output(sender) {
//console.warn($(arg.target));
console.info('New Selected Value: ' + $(sender.target).find("option:selected").val());
}
function vm() {
var self = this;
self.Project = ko.observable(new Project({ Name: 'Knockout', Employee: me }));
self.selectedEmployee = ko.observable(me);
self.employees = ko.observableArray([
new Employee({ ID: 1, Name: 'Aaron' }),
new Employee({ ID: 2, Name: 'George' }),
new Employee({ ID: 3, Name: 'Ross' })
]);
}
ko.applyBindings(vm);