骨干在ajax请求中设置模型

时间:2013-07-05 09:49:25

标签: ajax backbone.js

大家好我在Backbone中有一个应用程序,我想在一个函数内部将价格从GBP转换为EUR,例如使用一个用ajax调用的php文件。 在成功函数中,我想将转换器数据分配给我的对象。 但似乎没有设置这个因为在模板中uin下划线总是有旧值。 这是我在我的模型中的功能:

toJSON: function() {
        var json = _.clone(this.attributes);

        json.rooms = this.rooms.toJSON();
        _.each(json.rooms, function(room){
            var converter ="<?php echo(site_url('/backend/hotel/ajax_currency')); ?>";
            $.ajax({   
                url: converter, 
                type: "POST", 
                data: {
                        from_currency : room.currency,
                        amount : room.price_adult
                    }, 
                dataType: "json", 
                success: function(data) {
                    console.log(data);
                    room.price_adult =  data;
                }
            });
        });
        return json;
    },

我也尝试过:

room.model.set('price_adult',data);

但返回我找不到模型的错误。 我怎么解决?

1 个答案:

答案 0 :(得分:2)

这不是你想要放入JSON函数的东西,我可以想到它为什么适合你的几个原因。最重要的一点是toJSON函数是同步的,而AJAX响应是异步的。所以在你从ajax得到响应之前你的渲染功能正在发生。

我建议使用一个负责并发的Room模型,当ajax返回并且price_adult准备就绪时,它的视图将呈现它。

var Room = Backbone.Model.extend({
    initialize:function(){
        this.convertConcurrency();
    },
    convertConcurrency:function(){
        var model = this;
        $.ajax(....., 
           success:function(data){
               model.set("price_adult", data);
           }
        );
    },
});
var RoomView = Backbone.View.extend({
    initialize: function(){
        this.listenTo(this.model, "change:price_adult", this.render);
        if (this.model.has("price_adult")) this.render();
    },
    .....
});
var Rooms = Backbone.Collection.extend({...})
var RoomsView = // Rooms collection view

这样,只有在price_adult准备就绪时才会呈现视图。

也许您应该在客户端上创建一个模型,从服务器收集并发信息并自行计算并发会话,因此您只有一个ajax,模型将为您而不是服务器计算它。