gpt4 book ai didi

jquery - Knockout JS 中的依赖可观察数组

转载 作者:行者123 更新时间:2023-12-01 06:39:11 25 4
gpt4 key购买 nike

我已经开始使用knockoutjs 并做一些简单的绑定(bind)/依赖绑定(bind)。我的目标是拥有 1 <select>基于另一个 <select> 的值填充的列表列表。两者都是通过对我的 asp.net web 服务的 ajax 调用加载的。

所以我有两个<select>列表

<select id="make" data-bind="options: availableMakes, value: selectedMake, optionsText: 'text', optionsCaption: 'Choose a make'"></select>
<select id="model" data-bind="options: availableModels, value: selectedModel, optionsText: 'text', optionsCaption: 'Choose a model'"></select>

然后我的 JavaScript 看起来像这样:

$(function () {

// creating the model
var option = function (text, value) {
this.text = text;
this.value = value;
}

// creating the view model
var searchModel = {
availableMakes: ko.observableArray([]),
availableModels: ko.observableArray([]),
selectedMake: ko.observable(),
selectedModel: ko.observable()
}

// adding in a dependentObservable to update the Models based on the selected Make
searchModel.UpdateModels = ko.dependentObservable(function () {
var theMake = searchModel.selectedMake() ? searchModel.selectedMake().text : '';
if (theMake != '') {
$.ajax({
url: "/data/service/auction.asmx/GetModels",
type: 'GET',
contentType: "application/json; charset=utf-8",
data: '{make:"' + theMake + '"}',
success: function (data) {
var makes = (typeof data.d) == 'string' ? eval('(' + data.d + ')') : data.d;
var mappedModels = $.map(makes, function (item) {
return new option(item.text, item.value);
});
searchModel.availableModels(mappedModels);
},
dataType: "json"
});
}
else {
searchModel.availableModels([]);
}
return null;
}, searchModel);

// binding the view model
ko.applyBindings(searchModel);

// loading in all the makes
$.ajax({
url: "/data/service/auction.asmx/GetMakes",
type: 'GET',
contentType: "application/json; charset=utf-8",
data: '',
success: function (data) {
var makes = (typeof data.d) == 'string' ? eval('(' + data.d + ')') : data.d;
var mappedMakes = $.map(makes, function (item) {
return new option(item.text, item.value);
});
searchModel.availableMakes(mappedMakes);
},
dataType: "json"
});

});

目前这按预期工作,但我认为我做错了,因为代码看起来很长,而且我可以在更少的代码中使用 Knockoutjs 来做到这一点。还有我加载 availableModels 的方式显然不正确,因为我使用的是一个名为 UpdateModels 的 dependentObsevable我添加它是为了加载 availableModels基于 selectedMake().text 的值

我希望这是有道理的,你能指出一个改进版本吗?或者简单地告诉我如何根据“制作”选择重新加载模型?

非常感谢,

最佳答案

我认为你的代码看起来很正常。对于 UpdateModels dependentObservable,您实际上可以使用对 selectedMake 的手动订阅,如下所示:

searchModel.selectedMake.subscribe(function (newMake) {
if (newMake) {
//ajax request
}
else {
searchModel.availableModels([]);
}
}, searchModel);

这不会改变功能,只是一种更明确的方式来订阅单个可观察的更改。

您还可以选择在绑定(bind)中使用 optionsValue: 'text'(或 'value'),并且您的 selectedMake 将直接设置为文本或值。

如果您的模型是 make 对象的子对象,那么您甚至可以将模型绑定(bind)到 selectedMake().models (需要防止 selectedMake 为 null,这可以使用 DO 来完成,1.3 控制流绑定(bind),或内联如 selectedMake() ? selectedMake().models : []

关于jquery - Knockout JS 中的依赖可观察数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7584918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com