Knockout.js 淘汰-将动态ajax数据绑定到引导模式-更新
我一直在研究这个问题: 我已经在上面的问题中找到了答案,并在items data属性中添加了一个函数,以表明我可以拥有一个函数,而不是硬编码的数据。这是小提琴: 下面是虚拟机数据结构的一个深度简化版本Knockout.js 淘汰-将动态ajax数据绑定到引导模式-更新,knockout.js,twitter-bootstrap-3,bootstrap-modal,Knockout.js,Twitter Bootstrap 3,Bootstrap Modal,我一直在研究这个问题: 我已经在上面的问题中找到了答案,并在items data属性中添加了一个函数,以表明我可以拥有一个函数,而不是硬编码的数据。这是小提琴: 下面是虚拟机数据结构的一个深度简化版本 data: { tasks: [ { taskId: 1, taskName: 'Renew Widget' parts: [ {
data: {
tasks: [ {
taskId: 1,
taskName: 'Renew Widget'
parts: [ {
genericPartId: 1,
genericPartName: 'Widget',
partOptions:[{
optionId: 1
manufacturerNo: 'AD12',
cost: 100
},
{
optionId: 2
manufacturerNo: 'LY77',
cost: 75
},
{
optionId: 3
manufacturerNo: 'F8UI',
cost: 135
}
]
}
]
}
]
}
所以在我的主页上有一个任务列表,下面有一个部分列表。如果每个零件都有多个零件选项,则每个零件都有一个定位点,单击该定位点时应显示一个显示零件选项的模式
事实上,检索零件选项的成本很高,因此我希望作为单击的一部分来进行ajax调用,以填充可观察的零件选项。这将导致显示模态。然而,使用RPN实现的模式自定义绑定使其比仅仅响应单击以进行ajax调用更加复杂。我现在已经添加了RPN建议的onDemandObservable实现,这将有助于异步性。代码如下所示:
ko.onDemandObservable = function (callback, target) {
var _value = ko.observable(); //private observable
var result = ko.computed({
read: function () {
//if it has not been loaded, execute the supplied function
if (!result.loaded()) {
callback.call(target);
}
//always return the current value
return _value();
},
write: function (newValue) {
//indicate that the value is now loaded and set it
result.loaded(true);
_value(newValue);
},
deferEvaluation: true //do not evaluate immediately when created
});
//expose the current state, which can be bound against
result.loaded = ko.observable();
//load it again
result.refresh = function () {
result.loaded(false);
};
return result;
})
下面是我在vm中获得的ko映射代码的一个片段:
"potentialParts": {
create: function (partItem) {
var part = ko.mapping.fromJS(partItem.data);
part.isOilPart = ko.computed(function () {
var OIL_GENART1 = 3224;
var OIL_GENART2 = 1862;
return part.partNo() === "|PPL|" && (part.genArtNumber() === OIL_GENART1 || part.genArtNumber() === OIL_GENART2);
});
part.data = ko.onDemandObservable(self.getPartsSelectorData, part);
part.modalTemplateName = ko.observable("PartSelectorDialogTemplate");
return part;
}
}
下面是getPartSelectorData代码:
self.getPartsSelectorData = function() {
var that = this;
var url = "/Worksheet/GetPotentialPartSelectorData?partId=" + that.partID() + ""eItemOrdinalId=" + that.quoteItemOrdinalId();
$.ajax({
url: url,
type: "GET",
dataType: "JSON",
success: function (result) {
that.data(ko.mapping.fromJS(result.data));
},
error: function () {
}
});
}
更新:修复了That.data属性的更新。在模态自定义绑定处理程序的更新中,有可用的实际数据
模态背景现在显示,但我没有看到任何模态内容。我怀疑没有呈现我的模板。我对模板不太了解,所以我可能弄糟了一些东西。
part.data=ko.observearray()
然后进行Ajax调用,其then
子句将设置part.data
的内容。谢谢,我知道如何进行异步Ajax调用。请允许我恭敬地请你重读这个问题,并指出我在问题中遗漏了什么,而我的实际要求并不清楚。谢谢。在什么方面不起作用?如果单击绑定进行ajax调用,并且ajax调用将您的fiddle设置为currentmodel
,那么您应该具有所需的行为。这部分的问题在于我使用的是一个简单的计算可观察对象。我需要将这个值设置为真。我最终使用onDemandObservable来总结所有必要的功能。感谢上帝为RPN!现在是我的模板没有被渲染。我会再看一看,并根据需要修改我的问题。啊,是的。不幸的是,延迟评估
默认为false。