1

大家好,我在 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);

但返回我找不到模型的错误。我该如何解决?

4

1 回答 1

2

这不是您想放入 toJSON 函数的东西,我可以想到几个原因为什么它应该适合您。最重要的是 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,并且模型将为您而不是服务器计算它。

于 2013-07-05T11:17:44.600 回答