[英]Set item name from combobox to knockout list
我有一个问题,从组合框到淘汰赛列表显示价值。 请在我从组合框中选择项目的下方显示图像。 当我从组合框中选择项目时,它将更新具有相同值的所有行。
左侧的列表未在数据库中存储组合框的名称,但存储了ID。 因此,组合框和列表与状态栏相连。 在我的HTML中,我定义了以下列表,其中ChangeControlName是我要绑定到列表的列表
<tbody data-bind="foreach: versionDataByProduct">
<tr data-bind="click: $root.EditVersionDetail, css: { selected: isSelected}" >
<td data-bind="text: Name "></td>
<td data-bind="text: Code"></td>
<td data-bind ="text: PlatformVersionName"></td>
<td data-bind ="text: ChangeControlName"></td>
</tr>
combox在我的viewmodel中加载如下
// Load Change Control List
function loadChangeControlList() {
$.ajax({
url: "../RestService/Product/ChangeControlList",
type: "PUT",
contentType: 'application/json',
processData: false,
error: function (XMLHttpRequest, textStatus, errorThrown) {
},
success: function (allData) {
var mappedChangeControls = $.map(allData, function (item) {
return new changeControlList(item);
});
self.ChangeControls(mappedChangeControls);
}
});
}
我已经将我的组合框绑定到html中,如下所示
<td><select id="selModuleType" data-bind="options: $root.modules, optionsCaption: 'Please select Module...' , value: $root.editModuleId , optionsText: 'ModuleName'" /></td>
当我选择上图所示的左侧行时,我被选中。 在值editModuleId的订阅事件中,我尝试将值分配给选定的行,如下所示。
self.editChangeControl.subscribe(function (value) {
if (!value) {
return;
}
self.selecteditem().ChangeControlId(value.Status());
self.selecteditem().ChangeControlName(value.ChangeControl());
});
在上面的代码中,selecteditem包含我们选择的行。 正如您在代码中上面看到的那样,ChangeControlId是我们从组合框中选择的值的ID,并且已正确设置为列表。 但是名称设置不正确。 原因是ChangeControlId存储在数据库中。 ChangeControlId是显示这些行的表的一部分。 我想要ChangeControlName仅用于显示目的。 我该怎么办? 我也尝试过使用可计算的可观察值,但它在列表中显示为“对象对象”。 我使用了如下所示的可计算观察值
this.ChangeControlName = ko.computed({
read: function () {
debugger;
return ko.utils.arrayFirst(self.ChangeControls(), function (item) {
if (item.Status() === productVersionId.ChangeControlId()) {
return item.ChangeControl();
}
});
},
write: function (value) {
console.log("Value i get " + value);
return value;
}
});
在这里,您拥有的设计很难到达您想要去的地方。
var VersionModel = function () {
var self = this;
self.changeControls = ko.observable([{
name: "Addressed",
value: 1
}, {
name: "Not Addressed",
value: 2
}]);
console.log(self.changeControls()[0].value);
self.versionDataByProduct = [{
Name: "DS",
Code: "sd",
PlatformVersionName: "5.5.3",
ChangeControl: ko.observable(self.changeControls()[0]),
}, {
Name: "EF",
Code: "sd",
PlatformVersionName: "5.5.3",
ChangeControl: ko.observable(self.changeControls()[0])
}];
self.selected = ko.observable(self.versionDataByProduct[0]);
self.EditVersionDetail = function (item) {
self.selected(item);
};
self.editModuleId = ko.observable();
self.modules = [{
editModuleId: 1,
ModuleName: "ABW-BP-Batch Input"
}];
self.editChangeControl = ko.computed({
read: function () {
if (self.selected()) {
console.log('something selected and editChangeControl is changing');
return self.selected().ChangeControl();
}
return '';
},
write: function (value) {
if (value && value != '') {
console.log('writing new value');
self.selected().ChangeControl(value);
}
}
});
}
ko.applyBindings(new VersionModel());
和html:
<table class="floatLeft">
<thead>
<tr>
<th>Version name</th>
<th>Version Code</th>
<th>Framework version</th>
<th>Change control</th>
</tr>
</thead>
<tbody data-bind="foreach: versionDataByProduct">
<tr data-bind="click: $root.EditVersionDetail, css: { selected: $root.selected() == $data}">
<td data-bind="text: Name "></td>
<td data-bind="text: Code"></td>
<td data-bind="text: PlatformVersionName"></td>
<td data-bind="text: ChangeControl().name,attr:{'data-value':ChangeControl().value}"></td>
</tr>
</tbody>
</table>
<select id="selModuleType" data-bind="options: $root.modules, optionsCaption: 'Please select Module...' , value: $root.editModuleId , optionsText: 'ModuleName'"></select>
<select id="selfChangeControl" data-bind="options: $root.changeControls, optionsCaption: 'Please select Change control...' , value: editChangeControl , optionsText: 'name'"></select>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.