简体   繁体   中英

how can I update a model with custom idAttribute

in my simple backbone application, I am trying to update a model and every time it send a put request instead of post.

Well, this is my model named categoryModel

define(['Backbone'], function (Backbone) {
var CategoryModel = Backbone.Model.extend({
    defaults: {
        ID: '',
        Name: 'Empty',
        TagID: '0',
        GID: '0'
    },
    idAttribute: "ID",
    initialize: function () {
        if (!this.get('Name')) {
            this.set({ 'Name': this.defaults.Name });
        }
    }
});

return CategoryModel;
});

this is the collection

define(['Backbone','../../models/categories/categoryModel'], function (Backbone, categoryModel) {
var CategoryCollection = Backbone.Collection.extend({
    url: '/parentcategory/Actions',
    model: categoryModel
   });

return new CategoryCollection;
});

here are my methods in the view

on a keychange event

createNewItem: function (e) {
    var $this = $(e.currentTarget);
    $('#selectedCategoryName').html($this.val());
    //it creates a new model
    globals.NewCategory = new CategoryModel({ Name: $this.val() });
}

on handleDrop event

handleDropEvent: function (event, ui) {
var draggable = ui.draggable;
//check if name has set
if (!globals.NewCategory) {
    alert("Please write a category name");
    $('#createNewCategory').focus();
    return;
}
//get itemID
var itemID = draggable.attr("id").split('_')[1];
var itemDesc = draggable.attr("id").split('_')[0];
//check items category
if (itemDesc == "Tag") {
    //check if tagID already exists
    if (globals.NewCategory.TagID) {
        alert("you have already specify a tag from this category");
        return;
    }
    globals.NewCategory.set("TagID", itemID);
} else if (itemDesc == "gTag") {
    if (globals.NewCategory.GID) {
        alert("you have already specify a tag from this category");
        return;
    }
    globals.NewCategory.set("GID", itemID);
}
categoriesCollection.create(globals.NewCategory, {
    silent: true,
    wait: true,
    success: function (model, response) {
        model.set("ID", response);
        alert(model.id);
    }
});
}

The categoriesCollection.create is called twice. Firstly for setting the TagID (on a success request it gets an ID ) and secondly for setting the GID. Since the ID has been set, shouldn't had sent a POST request instead of PUT on the second call?

What am I doing wrong?

Thanks

The standard behaviour is to send a POST if the model is new ( doesn't have an ID attributed ) and send a PUT if the model id is set.

In your case it's working as designed, if you want it to use POST to send UPDATES you have to override Backbone.sync to work as you need, but I think it's easier for you to make your backend RESTful and create a PUT listener controller method for updates.

Another thing, if I got it right you are using create() to update models in your collection, I would advise you not to do that and instead use the save() directly in the model you want to update, the code will be a lot more readable.

Cheers.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM