Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

dynamic key in JSON file (used by backbone.js models for example...)

I am trying to create a backbone.js model with dynamic keys but can't seem to get it done right.

Here's my model:

window.MyModel = Backbone.Model.extend({
    myDynamicVar : "country",
    urlRoot: "api/myModel",
    defaults: {
        "id": null,
        this.myDynamicVar : "USA",
        "country":  {
            "route":"test/test/test",
            "class":".usa2",
            "txt":"USA 2"
        },  
        "region":  "California",
        "year":  "",
        "description":  "",
        "picture":  ""
      }
});

Here I am trying to have myDynamicVar replaced by its content in my model. Any thought how I could get this done? Thanks in advance, Jimmy

like image 713
Jimmy Luis Avatar asked Mar 25 '26 00:03

Jimmy Luis


2 Answers

You won't be able to do that directly; the left side of the ":" in an object literal must be a constant. What you can do is this:

window.MyModel = Backbone.Model.extend({
    myDynamicVar : "country",
    urlRoot: "api/myModel",
    defaults: function(fieldName) {
      var value = {
        "id": null,
        "country":  {
            "route":"test/test/test",
            "class":".usa2",
            "txt":"USA 2"
        },  
        "region":  "California",
        "year":  "",
        "description":  "",
        "picture":  ""
      };
      value[fieldName] = "USA";
      return value;
    }(this.myDynamicVar)
});

edit — ah, I just noticed that "myDynamicVar" itself is part of the outer object. There's no way to refer to it with this in such a way, so if that's what you're trying to do the code would be different:

window.MyModel = Backbone.Model.extend(function() {
  var value = {
    myDynamicVar : "country",
    urlRoot: "api/myModel",
    defaults: {
        "id": null,
        "country":  {
            "route":"test/test/test",
            "class":".usa2",
            "txt":"USA 2"
        },  
        "region":  "California",
        "year":  "",
        "description":  "",
        "picture":  ""
      }
   };

   value.defaults.[value.myDynamicVar] = "USA";
   return value;
}());

If you want myDynamicVar itself to be dynamic, then you could pass it in as a parameter:

window.MyModel = Backbone.Model.extend(function(whichProperty) {
  var value = {
    myDynamicVar : "country",
    urlRoot: "api/myModel",
    defaults: {
        "id": null,
        "country":  {
            "route":"test/test/test",
            "class":".usa2",
            "txt":"USA 2"
        },  
        "region":  "California",
        "year":  "",
        "description":  "",
        "picture":  ""
      }
   };

   value.defaults.[value[whichProperty]] = "USA";
   return value;
}("myDynamicVar"));
like image 118
Pointy Avatar answered Mar 26 '26 14:03

Pointy


You cannot use a variable in defining the object key. You can try something like this.

window.MyModel = Backbone.Model.extend({
    myDynamicVar : "country",
    urlRoot: "api/myModel",
    defaults: {
        "id": null,
        "country":  {
            "route":"test/test/test",
            "class":".usa2",
            "txt":"USA 2"
        },  
        "region":  "California",
        "year":  "",
        "description":  "",
        "picture":  ""
      }
});

window.MyModel.defaults[this.myDynamicVar] = "USA";
like image 20
ShankarSangoli Avatar answered Mar 26 '26 12:03

ShankarSangoli



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!