大家好我在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);
但返回我找不到模型的错误。 我怎么解决?
答案 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,模型将为您而不是服务器计算它。