Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Knockout.js设置选择对象的选项_Knockout.js - Fatal编程技术网

Knockout.js设置选择对象的选项

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.

我正在进行我的第一个淘汰赛项目,努力找出处理这种情况的最佳方法

希望这个简化的例子能达到目的

我正在尝试编辑一个具有“employee”属性的“project”对象

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);