如何使用 json 和 knockoutjs 创建一个主详细信息级联下拉菜单?
一个简单的主细节场景: 服务器列表
int id
string Name
List<Driver> Drivers
,其中驱动程序也有 ID 和名称。 从服务器上的 MVC Action 以 JSON 形式返回。
现在我有一个knockoutjs模型
var ViewModel;
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
ViewModel = {
IpAddress: ko.observable($("#IpAddress").val()),
Servers: ko.observableArray([]),
SelectedServer: ko.observable()
};
ViewModel.ValidIp = ko.dependentObservable(function() {
return /^(([2]([0-4][0-9]|[5][0-5])|[0-1]?[0-9]?[0-9])[.]){3}(([2]([0-4][0-9]|[5][0-5])|[0-1]?[0-9]?[0-9]))$/i.exec(this.IpAddress());
}, ViewModel);
ViewModel.GetSnmpData = ko.dependentObservable(function() {
if (this.lastSnmpRequest) {
this.lastSnmpRequest.abort();
}
if (this.ValidIp()) {
return this.lastSnmpRequest = $.ajax({
url: GetPrinterDataUrl,
type: "POST",
data: {
IpAddress: this.IpAddress()
},
success: __bind(function(data) {
this.Servers(data.Servers);
}, this)
});
}
}, ViewModel);
ko.applyBindings(ViewModel);
,一些绑定
<input name="IpAddress" id="IpAddress" type="text" data-bind="value: IpAddress ,valueUpdate: 'afterkeydown'" value=""/>
<select name="ServerId" id="ServerId" data-bind="options: Servers,optionsText:'Name' ,optionsValue:'Id', value: SelectedServer" />
<select name="DriverId" id="DriverId" data-bind="options: SelectedServer()? SelectedServer().Drivers: null,optionsText:'Name',optionsValue:'Id'">
问题是:服务器下拉列表被填充,而驱动程序没有。 我肯定错过了一些东西。也许我需要使用映射插件?
A simple master details scenario:
list of servers
int id
string Name
List<Driver> Drivers
where Driver also has an Id and Name.
returned as JSON from MVC Action on server.
Now i have a knockoutjs model
var ViewModel;
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
ViewModel = {
IpAddress: ko.observable($("#IpAddress").val()),
Servers: ko.observableArray([]),
SelectedServer: ko.observable()
};
ViewModel.ValidIp = ko.dependentObservable(function() {
return /^(([2]([0-4][0-9]|[5][0-5])|[0-1]?[0-9]?[0-9])[.]){3}(([2]([0-4][0-9]|[5][0-5])|[0-1]?[0-9]?[0-9]))$/i.exec(this.IpAddress());
}, ViewModel);
ViewModel.GetSnmpData = ko.dependentObservable(function() {
if (this.lastSnmpRequest) {
this.lastSnmpRequest.abort();
}
if (this.ValidIp()) {
return this.lastSnmpRequest = $.ajax({
url: GetPrinterDataUrl,
type: "POST",
data: {
IpAddress: this.IpAddress()
},
success: __bind(function(data) {
this.Servers(data.Servers);
}, this)
});
}
}, ViewModel);
ko.applyBindings(ViewModel);
and some bindings
<input name="IpAddress" id="IpAddress" type="text" data-bind="value: IpAddress ,valueUpdate: 'afterkeydown'" value=""/>
<select name="ServerId" id="ServerId" data-bind="options: Servers,optionsText:'Name' ,optionsValue:'Id', value: SelectedServer" />
<select name="DriverId" id="DriverId" data-bind="options: SelectedServer()? SelectedServer().Drivers: null,optionsText:'Name',optionsValue:'Id'">
problem is: servers dropdown gets populated, while drivers does not.
I'm surely missing something. Maybe i need to use mapping plugin?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
SelectedServers() 返回
server.Id
而不是server
对象。尝试删除 ServerId 选择中的
optionsValue: 'Id'
:SelectedServers() returns
server.Id
instead ofserver
object.Try remove
optionsValue: 'Id'
in the ServerId select: