backbone.js modifies the url parameter of a template and extract does not update the retrieved data

advertisements

I have the following Model:

window.MyModel = Backbone.Model.extend({
     initialize: function(props){
          this.url = props.url;
     } 

     parse: function(){

          // @override- parsing data fetched from URL
     }

});

 // instantiate
  var mod = new MyModel({url: 'some/url/here'});

I use this global variable 'mod' to fetch some data into this model from backend.

 // fetch

 mod.fetch({
       success: function(){ ...},
       error: ...

 });

All above works well.... My Issue: I want to reuse this model by changing resetting the url and call fetch but it does not update the url somehow. I have tried the following:

  mod.fetch({
       data: {url:'/some/other/url'},
       postData: true,
       success: function(){ //process data},
       error: ...
  });

 mod.set({url: '/some/other/url'});
 // called fetch() without data: and postData: attributes as mentioned in previous

How do I set the url for my model so that I could call fetch() and it fetches data from updated url? Am I missing something. Thanks for any pointers..

UPDATE 1: Basically, I am unable to get updated values if I did

    model.set({url: 'new value'});

followed by

    model.fetch();

'model' is a global variable. Creating a fresh instance of 'model' works:

    model = new Model({url:'/some/other/url'});
    model.fetch();

however, works as required. Does this mean that a model instance is permanently attached to a url and it cannot be reset?

ANSWER TO MY QUESTION in UPDATE 1 Model instance is not permanently attached to a url. It can be reset dynamically. Please read through @tkone's thorough explanation and then @fguillens' solution for a better understanding.


After have understood the @tkone 's explanation...

If you still want to have a dynamic Model.url you always can delay its construction to run time, try this:

window.MyModel = Backbone.Model.extend({
  url: function(){
    return this.instanceUrl;
  },
  initialize: function(props){
    this.instanceUrl = props.url;
  }
}