简体   繁体   中英

Check if backbone has been fetched, or changed?

I need to have two url properties inside my Backbone.Collection.extend() because if a collection is fetched then I need to use a specific url if the collection gets a new model then I want to change the url

module.exports = MessagesCollection = Backbone.Collection.extend({
    initialize: function(models, options) {
        this.id = options.id;
    },
    url: function() {
        if (fetch method is called) {
            return '/api/messages/' + this.id;
        } else {
            // here if a model is being added?
            return '/api/messages'
        }
    },
    model:  MessageModel
});

The reason for this is because I only want to pull down the models from the server based on the user.

var me = new MeModel();    
me.fetch({
    success: function(response) { 
        App.data.me = me;
        var messages = new MessagesCollection([], { id: response.get('user_id') });
        messages.fetch({
            success: function() {
                App.data.messages = messages;
                App.core.vent.trigger('app:start');
            } 
        }); 

    } 
});

When the user creates a new model within the app I want it to go into the main collection?

Does this mean I should create a sub collection based on the main collection somehow?

Edit:

My create looks like this somewhere else in the app window.App.data.messages.create(Message); I am thinking maybe I could write something like

    var me = new MeModel();    
    me.fetch({
        success: function(response) { 
            App.data.me = me;
            var messages = new MessagesCollection([], { id: response.get('user_id') });
            var allMessages = new MessagesCollection();
            messages.fetch({
                success: function() {
                    App.data.messages = messages;
                    App.data.allMessages = allMessages;
                    App.core.vent.trigger('app:start');
                } 
            }); 

        } 
    });

Then create window.App.data.allMessages.create(Message); > It sounds like it can cause problems IDK any ideas?

Edit:

The above worked but I had to create a new Backbone.Collection.extend() passing the same model but just writing it like

var Backbone = require('backbone'),
    MessageModel = require('../models/message');

module.exports = AllMessagesCollection = Backbone.Collection.extend({
    model:  MessageModel,
    url: '/api/messages'
});

So let me really break this question down, is this solution problematic. What is the best way to do this? The worst thing I can think of is bandwidth, using this method I would constantly be sending requests!

If you need to use different url only when create new model you can override collection.create method:

var MessagesCollection = Backbone.Collection.extend({
    initialize: function(models, options) {
        this.id = options.id;
    },
    url: function() {
      return '/api/messages/' + this.id;
    },
    create: function(model, options){
      var extendedOptions = _.extend(options || {}, {url: '/api/messages'});
      return this.constructor.__super__.create.call(this, model, extendedOptions);
    }
});

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