Knockout.js 淘汰-将动态ajax数据绑定到引导模式-更新

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: [ {

我一直在研究这个问题:

我已经在上面的问题中找到了答案,并在items data属性中添加了一个函数,以表明我可以拥有一个函数,而不是硬编码的数据。这是小提琴:

下面是虚拟机数据结构的一个深度简化版本

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() + "&quoteItemOrdinalId=" + 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。