JQuery - 函数回调? ($ .Deferred)

时间:2012-08-23 21:59:34

标签: ajax jquery

我目前的功能如下:


$(function(){
 $('.chained_to_vehicle_make_selector').remoteChainedTo('.chained_parent_vehicle_make_selector', '/models.json');
 $('.chained_to_vehicle_model_selector').remoteChainedTo('.chained_parent_vehicle_model_selector', '/trims.json');
 $('.chained_to_vehicle_trim_selector').remoteChainedTo('.chained_parent_vehicle_trim_selector', '/model_years.json');
});

正如您可能知道的那样,每个remoteChainedTo函数正在进行AJAX调用,它运行正常,但需要一些时间。

然后我有第二个代码块:


$(function() {
    $(".chzn-select").chosen();
    $(".chained_parent_vehicle_make_selector").chosen().change( function() {$(".chained_to_vehicle_make_selector").trigger("liszt:updated"); });
    $(".chained_parent_vehicle_model_selector").chosen().change( function() {$(".chained_to_vehicle_model_selector").trigger("liszt:updated"); });
    $(".chained_parent_vehicle_trim_selector").chosen().change( function() {$(".chained_to_vehicle_trim_selector").trigger("liszt:updated"); });
    $(".chained_child").chosen();
});

只要在第一部分完成后触发,代码的这一部分就可以正常工作。但是,由于AJAX调用,它目前在上一节之前触发。

如何实现一个结构,以便在第一个块完成后第二个代码块始终触发? remoteChainedTo函数没有定义的回调(我可以看到),并且在任何情况下都不可能知道三个调用中的哪一个将最后完成,因此想要以某种方式将回调放在块上,以便第二个只有在最后一次AJAX调用完成后才会触发代码段。

编辑:经过一些重构后,我的代码现在看起来如下:


function makeChains(){
 $('.chained_to_vehicle_make_selector').remoteChainedTo('.chained_parent_vehicle_make_selector', '/models.json');
 $('.chained_to_vehicle_model_selector').remoteChainedTo('.chained_parent_vehicle_model_selector', '/trims.json');
 $('.chained_to_vehicle_trim_selector').remoteChainedTo('.chained_parent_vehicle_trim_selector', '/model_years.json');
}

var chainCall = $(function() {
    makeChains();
});

chainCall.done(function() { 
        $(".chzn-select").chosen();
        $(".chained_parent_vehicle_make_selector").chosen().change( function() {$(".chained_to_vehicle_make_selector").trigger("liszt:updated"); });
        $(".chained_parent_vehicle_model_selector").chosen().change( function() {$(".chained_to_vehicle_model_selector").trigger("liszt:updated"); });
        $(".chained_parent_vehicle_trim_selector").chosen().change( function() {$(".chained_to_vehicle_trim_selector").trigger("liszt:updated"); });
        $(".chained_child").chosen();
    });

但我仍然收到错误Object [object Object] has no method 'done'。任何提示都赞赏。

0 个答案:

没有答案