淘汰赛中的级联主要细节和加载记录。 JS

时间:2013-01-23 11:07:00

标签: javascript mvvm knockout.js master-detail

我们有以下情况:

One select conected to one observable property Countries, and countryId
Another child select conected to StateProvinces and stateProvinceId observable property 
A compute generating the dependency between the first and second property (Countris and StateProvinces).
We click Load and simulate load a entity from the server, and update the selected values: countryId and stateProvinceId. The real coding uses the mapping plugin.

为了更清楚,请参阅工作的jsfiddle http://jsfiddle.net/sPTHm代码,然后点击“加载”。

当我们在第48行模拟状态/省选择的异步ajax请求时,我们开始遇到麻烦。当此请求是异步时,加载不起作用,只是因为stateProvinceId在StateProvinces加载之前设置了,它将被重置为null。在此处查看带有StateProvinces异步请求的模拟:http://jsfiddle.net/sPTHm/1/,然后单击“加载”。

我们已经尝试过:限制,计算可观察食谱,延迟评估和大量搜索。在knockoutjs中,这个理想配方是什么?

1 个答案:

答案 0 :(得分:0)

我会尝试使用jQuery deferred concept

链接您的ajax请求
        return $.when(self.dataSource.getRtuUserData(rtuId))
            .then(function (rtuUserData)
            {
                self.RtuUserData = ko.mapping.fromJS(rtuUserData);
                return self.dataSource.getRtuStatus(rtuId);
            })
            .then(function (rtuStatus)
            {
                self.RtuStatus = ko.mapping.fromJS(rtuStatus);
                return self.dataSource.getRtuLocation(rtuId);
            })

dateSource对象上的每个方法都包含一个ajax调用:

self.getRtuLinks = function (rtuId)
{
    return $.ajax(
    {
        url: urlRoot + '/rtus/' + rtuId + '/links',
        dataType: 'json',
        cache: false,
        type: 'GET'
    });
}

通过这种方式,您可以同步加载两组数据,这可以解决您的问题。