Phonegap + Backbone + jquery mobile。 我的Backbone模型看起来像(删除了一些代码)
var Purchase = Backbone.Model.extend({
defaults: function() {
return {
name: "",
desc: "",
shopping: null,
price:null,
quantity:1,
createdAt: new Date().getTime(),
modifiedAt: new Date().getTime()
};
}
});
var PurchaseList = Backbone.Collection.extend({
model: Purchase,
comparator: 'name'
});
var ShoppingList = Backbone.Model.extend({
defaults: function(){
return {
name:"",
totalPrice: 0,
createdAt: new Date().getTime(),
modifiedAt: new Date().getTime(),
products: new PurchaseList()
};
}
});
更新购买逻辑重新计算ShoppingList的totalPrice
save: function(position){
var data = this.$el.find("form").serializeObject();
var price = parseFloat(data.price);
var quantity = parseFloat(data.quantity);
var product = new Purchase(data);
product.on('invalid', this.showError);
var shopping = GlobalShopping.findWhere({id: data.shopping});
if(!isNaN(price) && !isNaN(quantity))
shopping.set('totalPrice', shopping.get('totalPrice') + price * quantity);
if(!isNaN(price))
product.set('price', price);
else
product.unset('price');
if(!isNaN(quantity))
product.set('quantity', quantity);
if(this.model.id){
var oldProduct = shopping.get('products').findWhere({id: this.model.id});
if(oldProduct.get('price') != null)
shopping.set('totalPrice', shopping.get('totalPrice') - oldProduct.get('price') * oldProduct.get('quantity'));
product.id = this.model.id;
product.save({}, { success: function(){
shopping.get('products').add([product], {merge: true});
shopping.save({}, {success: function(){ // <<<< issue here
window.app_router.navigate('#shopping/' + data.shopping, {replace: true, trigger: true});
}});
}});
} else {
shopping.get('products').create(product, {wait: true, success: function(){
shopping.save({}, {success: function(){
window.app_router.navigate('#shopping/' + data.shopping, {replace: true, trigger: true});
}});
}, error: function(model, xhr, options){
alert(JSON.stringify(product.toJSON()));
}});
}
}
此代码在android 4.x上运行完美,但在没有PUT请求的情况下触发的android 2.x成功事件(由服务器日志检查)。
答案 0 :(得分:0)
如果查看Backbone源,只有在您尝试保存的模型具有Id时才会触发PUT请求。你可以尝试以下方法:
product.set('id', 1);
product.save();
快速浏览一下代码,我不确定您是如何填充产品的。你第一次拿它然后试图重新保存吗?无论如何,如果没有设置Id,Backbone将发出POST,如果设置了Id属性,则发出PUT。您可以像Backbone Docs那样更改您的Id属性属性。我会在两个实例中控制你的模型,并确保设置相关的Id属性。
奇怪的是它适用于android 2.x及更高版本的android 4。如果以上内容没有引导您朝着正确的方向前进,也许您可以提供更多关于产品设置的代码。
答案 1 :(得分:0)
这是android 2浏览器问题。它缓存GET,POST和PUT(facepalm)请求。 我
jQuery.ajaxSetup({
cache: false
});
但它仅影响GET请求。
我的最终解决方案是将urce添加到网址
url: function(){ return "rest_entity + $.now(); }