我在淘汰赛中动态创建字段。下面的代码将创建一个文本框或下拉选择列表。输入字段绑定到属性“Response”,我也订阅了它。当用户更改选择列表时,我想知道使用了什么类型的控件(例如Textbox或DropDownList)。我的问题是淘汰赛总是告诉我错误的类型;文本框,这是最后创建的字段:
$(document).ready(function() {
var fields = [{
"Label": "Enter The State",
"Length": 75,
"Type": "DropDownList",
"IsRequired": true,
"PreValue": "New York, New Jersey",
"Response": ""
}, {
"Label": "Enter Reason",
"Length": 75,
"Type": "DropDownList",
"IsRequired": true,
"PreValue": "Good,Bad,Ugly",
"Response": ""
}, {
"Label": "Enter City",
"Length": 75,
"Type": "TextBox",
"IsRequired": true,
"PreValue": "",
"Response": ""
}];
/* knockout */
function DynamicFormViewModel() {
var self = this;
self.fields = fields;
self.selectItem = function(value, text) {
this.value = value;
this.text = text;
};
for (var i = 0; i < self.fields.length; i++) {
var field = self.fields[i];
if (field.Type == 'TextBox') {
field.Response = ko.observable(field.PreValue);
} else if (field.Type === 'DropDownList') {
field.Items = [];
var itms = field.PreValue.split(",");
field.Items.push(new self.selectItem('', '--' + field.Label + '--'));
for (var s = 0; s < itms.length; s++) {
var sItem = new self.selectItem(itms[s], itms[s]);
field.Items.push(sItem);
}
field.Response = ko.observable(field.PreValue);
} else {
field.Response = ko.observable(field.PreValue);
}
field.Response.subscribe(function(newValue) {
if (newValue !== undefined && newValue != null && newValue.length > 0) {
alert(field.Type);
}
});
};
};
var viewModel = new DynamicFormViewModel();
ko.applyBindings(viewModel);
});
以下是一个工作示例:jsFiddle
答案 0 :(得分:2)
变量&#34;字段&#34;您的响应订阅正在被周围的循环更改,因此引用始终是循环中的最后一项。
您可以更改订阅功能,以便在其应该使用的上下文中传递&#34;此&#34;变量并使用它。
field.Response.subscribe(function(newValue) {
if (newValue !== undefined && newValue != null && newValue.length > 0) {
alert(this.Type);
}
}, field);