0

Phonegap + Backbone + jquery mobile。我的骨干模型看起来像(删除了一些代码)

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 成功事件(由服务器日志检查)。

4

2 回答 2

0

如果您查看 Backbone 源,则仅当您尝试保存的模型具有 Id 时才会触发 PUT 请求。您可以尝试以下方法:

product.set('id', 1);
product.save();

快速浏览一下您的代码,我不确定您如何填充您的产品。您是先获取它然后尝试重新保存它吗?无论如何,如果没有设置 Id,Backbone 将发出一个 POST,如果设置了 Id 属性,则会发出一个 PUT。您可以像Backbone Docs一样更改您的 Id 属性属性。我会在这两种情况下 console.log 你的模型,并确保设置了相关的 Id 属性。

奇怪的是,它适用于 android 2.x 及更高版本的 android 4。如果上述内容没有让您朝着正确的方向前进,也许您可​​以提供更多关于如何设置产品的代码。

于 2013-08-05T12:59:16.217 回答
0

这是 android 2 浏览器问题。它缓存 GET、POST 和 PUT(facepalm) 请求。ID

jQuery.ajaxSetup({
                 cache: false
            });

但它只影响 GET 请求。

我的最终解决方案是在 url 中添加 nonce

url: function(){ return "rest_entity + $.now(); }
于 2013-08-05T21:13:35.287 回答