Knockout.js绑定到dropdownlist

Knockout.js绑定到dropdownlist,knockout.js,Knockout.js,试图将数据绑定到下拉列表 function EmailTemplate(data) { var self = this; self.etId = ko.observable(data.email_template_id); self.etTypeId = ko.observable(data.email_template_type_id); self.etTitle = ko.observable(data.email_te

试图将数据绑定到下拉列表

    function EmailTemplate(data) {
        var self = this;
        self.etId = ko.observable(data.email_template_id);
        self.etTypeId = ko.observable(data.email_template_type_id);
        self.etTitle = ko.observable(data.email_template_title);
        self.etContent = ko.observable(data.email_template_content);
        self.etAppYear = ko.observable(data.app_year);
        self.etSubject = ko.observable(data.subject);
        self.etActive = ko.observable(data.active);
    }

    function EmailTemplateViewModel() {
        var self = this;
        self.ETList = ko.observableArray();

        var uri = '/admin/services/EmailTemplateService.svc/EmailTemplates';
        OData.read(uri, function (data, response) {
            $.each(data.results, function (index, item) {
                self.ETList.push(new EmailTemplate(item));
            });
        });
    }
    $(document).ready(function () {
        ko.applyBindings(new EmailTemplateViewModel());            
    });
HTML标记:

 <select data-bind="options: ETList, value:etId, optionsText: 'etTitle' "class="dropdown"></select>

当我运行此程序时,我得到: 未捕获错误:无法分析绑定。 消息:ReferenceError:未定义etIdis; 绑定值:选项:ETList,值:etId,选项文本:'etTitle'

当我们绑定到下拉列表时,我们应该如何绑定该值?绑定之后,我们应该如何在Knockout中捕获或创建下拉更改事件

使用
选项时,
绑定将确定选择了哪些选项,通常您会希望在viewmodel(例如
selectedTemplate
)中设置一个可观察的选项。然后,该可观察对象将自动映射到可观察数组中的实际对象。设置
value:etId
没有意义,因为根视图模型中没有
etId

例如:

HTML:



您可能打算使用
选项value:“etId”
,这可能会起作用,但通常是一种不太可取的方法(因为可观察对象的值现在将设置为ID而不是实际对象)

非常感谢@antishok!etId不在根viewmodel中,但etTitle也不在其中。在这种情况下,我应该如何将文本绑定到etTitle并将值绑定到etId,这样当我更改下拉选择时,我可以获得etId而不是etTitle?好的,我得到了,我可以说selectedTemplate()&&selectedTemplate().etId。所以selectedTemplate是绑定到选项的对象,但显示为文本的eTitle!!仍然不知道为什么我们需要先调用selectedTemplate(),然后使用&&,这是为了什么?在那里需要它,因为一开始没有选择的项,所以
selectedTemplate()==未定义的
。这与执行以下操作相同:
selectedTemplate()?selectedTemplate().etId:未定义
。如果没有这一点,我们将在尝试访问UnfineDiges上的
.etId
时出错!非常感谢你的解释。我还有另一个问题,dropdownlist实际上是一个触发器,一旦选中更改,然后订阅selectedTemplate来调用ajax来拉回数据,对于初始加载,这很好,我绑定到一个类似self.ETList的ObservalArray,但是每次dropdown更改选择并拉回数据时,我应该如何清理这个ObservalArray,现在需要继续添加,如果我指定self.ETList=[];在ajax回调之后但在数据绑定之前,我没有得到任何东西。。。
function EmailTemplateViewModel() {
    var self = this;
    self.ETList = ko.observableArray();
    self.selectedTemplate = ko.observable();
    // ...
}
<select data-bind="options: ETList, value:selectedTemplate, optionsText: 'etTitle'" class="dropdown"></select>