如何使用骨干{j}中的ajax调用模型呈现多个视图

时间:2015-07-06 07:38:38

标签: javascript jquery ajax backbone.js asynchronous

嘿大家I我正在尝试在骨干中绘制具有多个模型和相关视图的屏幕。为此,我对服务器进行了严格的ajax调用,以获取此数据的数据。首先我认为解决方案可能是jquery函数$ when(ajaxcall1,ajaxcall2)完成(函数),但....

Model1.js

getFById: function (id, context, success, error) {
    this.fetch({
        data: {
            id: id
        }
    }).success(function () {
        success();
    }).error(function () {
        error();
    });
},

解析函数数据

parse: function (response) {
    response.pedidosEntrega = new App.PedidosbookingCollection(response.datosPedidosbookingDto);
    response.cabeceraBookingDto = response.cabeceraBookingDto;
    return response;
}

model2.js

getFByBooking: function (idBooking, context) {
    return $.ajax({
        async: true,
        context: context,
        cache: false,
        type: 'GET',
        dataType: 'json',
        contentType: 'application/json',
        data: {
            id: idBooking
        },
        url: this.datosPorFUrl,
    });
},

在我的router.js中有调用渲染视图。

$.when(this.model.getFById(idBooking, idFactura, this),
       this.collectionF1Candidatas.getFByBooking(idBooking))
    .done(_.bind(function (modelBooking, facturasCandidatas) {
        this.asociarF1BookingExito(facturasCandidatas);
    }, this));

问题是模型1中的函数解析与此多次调用是异步的,并且在句子中不执行$。如何使用parse函数对ajax调用进行sincronyze?

我知道它不是骨干网的最佳解决方案。有人能告诉我一个更好的解决方案吗?在这个技术中实现它?

感谢所有人

1 个答案:

答案 0 :(得分:0)

首先,将成功(和错误?)回调传递给getFByBooking函数,以使接口与模型的getFById函数对齐。这样,你可以用同样的方式对待它们:

getFByBooking : function(idBooking, context, success /*, error*/) {
    $.ajax({
        // ...
        success: success
    });
}

现在,在您的路由器中,您可以将相同的成功回调传递给它们,但不要在第一个响应时调用它。你可以在这里利用下划线/ lodash的_.after的力量:

var success = _.bind(function (modelBooking, facturasCandidatas) {
    this.asociarF1BookingExito(facturasCandidatas);
}, this);

// let's tell it to only be invoked on the second call
success = _.after(success, 2);

this.model.getFById(idBooking, idFactura, success /*, error*/);
this.collectionF1Candidatas.getFByBooking(idBooking, idFactura, success /*, error*/);

我不知道您的客户端是否有ECMA 6,但如果是这样,您也可以使用generators来完成同样的事情,更加优雅。这是一个video,它明确表示日期。