我遇到了一个问题,理解我应该如何获得我使用knockout.mapping绑定的选择(下拉)列表的selectedValue。
继承人ajax调用和映射:
var EmailCollection;
function GetAllEmailsAjax() {
$.ajax({
url: "http://localhost:54756/api/Email",
type: "GET",
dataType: "JSON",
success: function (data) {
GetAllEmails(data);
}
});
}
function GetAllEmails(data) {
// not sure if this is 100% correct but it does seem to work as expected
if (!EmailCollection) {
EmailCollection = ko.mapping.fromJS(data);
}
ko.mapping.fromJS(data, EmailCollection);
ko.applyBindings(EmailCollection);
}
<select data-bind="options: EmailCollection, optionsText: 'Name', optionsValue: 'Id', optionsCaption: 'Choose...'"></select>
据我所知,我需要在select data-bind属性中指定值。所以它会是这样的:
但是,这意味着selectedEmail需要成为我模型的一部分。然而,所有这一切都是由knockout.mapping创建的,我不确定我是怎么做到的。我假设某种模型如下,但我不确定如何去做。
var EmailViewModel = {
selectedEmail : ko.Observable(),
Emails : EmailCollection // the previous model mapped bound in a scenario like this
};
// EmailViewModel.selectedEmail() would then contain my selected value..
我敢肯定,一旦我在纸面上看到它,就会在我努力解决这一问题的那一刻变得明显。
答案 0 :(得分:1)
如果只选择一封电子邮件(因为您使用的是下拉菜单,则隐含),您应该创建一个变量来保存所选的电子邮件ID。如果默认为集合中的第一封电子邮件,您可以执行以下操作:
var selectedEmailId: ko.observable();
...
function GetAllEmails(data) {
...
ko.mapping.fromJS(data, EmailCollection);
selectedEmailId(EmailCollection.peek().Id); //Assuming EmailCollection is an array
ko.applyBindings(EmailCollection);
}
<select data-bind="options: EmailCollection, optionsText: 'Name', optionsValue: 'Id',
optionsCaption: 'Choose...', value: selectedEmailId"></select>
当下拉选择发生变化时,应该更新selectedEmailId。