Vraag Backbone-model .toJSON () geeft niet alle attributen weer aan JSON


Ik moet de kenmerken van een model weergeven aan JSON, zodat ik ze kan omzetten in een sjabloon. Hier is wat een render () -functie voor een weergave eruitziet:

render: function() {
  console.log(this.model);
  console.log(this.model.toJSON());
  $(this.el).html(this.template(this.model.toJSON()));
  return this;
},

Hier volgt de uitvoer van attributen na het doen van console.log (this.model):

created_at: "2012-04-19"
id: "29"
name: "item"
resource_uri: "/api/v1/item/29/"
updated_at: "2012-04-21"
user: "/api/v1/user/9/"

Hier is de JSON-uitvoer van het model na het doen van console.log (this.model.toJSON ()):

id: "29"
__proto__: Object

Wat is er gebeurd?

Bewerk: Hier is de instantiatie:

  var goal = new Goal({id: id});
  goal.fetch();
  var goalFullView = new GoalFullView({
    model: goal,
  });

Dit is de inhoud van de nieuwe weergave:

  console.log(this.model.attributes);
  console.log(this.model.toJSON());

Dit is wat de console zegt:

Object
created_at: "2012-04-23"
id: "32"
name: "test"
resource_uri: "/api/v1/goal/32/"
updated_at: "2012-04-23"
user: "/api/v1/user/9/"
__proto__: Object

Object
id: "32"
name: "test"
__proto__: Object

Als de toJSON een kloon van de attributen moet maken, waarom kopieert het dan niet de juiste naam of waarom kopieert het niet de created_at, updated_at velden?

Bewerk 2: Hier is het model:

  var Goal = Backbone.Model.extend({

    // Default attributes for Goal
    defaults: {
      name: "empty goal",
    },

    // Check that the user entered a goal
    validate: function(attrs) {
      if (!attrs.name) {
        return "name is blank";
      }
    },

    // Do HTTP requests on this endpoint
    url: function() {
      if (this.isNew()) {
        return API_URL + "goal/" + this.get("id") + FORMAT_JSON;
      }
      return API_URL + "goal/" + FORMAT_JSON;
      //API_URL + "goal" + FORMAT_JSON, 
    },
  });

Bewerk 3: Ik kwam erachter dat ik de succes-callback van fetch moet gebruiken om een ​​weergave weer te geven die het model gebruikt:

goal.fetch ({succes: functie (model) {     var goalFullView = new GoalFullView ({       model: doel,     });   }});


10
2018-04-21 19:59


oorsprong


antwoorden:


De toJSON() methode retourneert gewoon een ondiepe kloon van de modellen attributes eigendom.

Van de geannoteerde Backbone.js-bron:

toJSON: function(options) {
  return _.clone(this.attributes);
}

Zonder meer van uw code te zien, ziet het ernaar uit dat u direct eigenschappen instelt op het modelobject, in plaats van het gebruik van de set functie om modelattributen in te stellen.

D.w.z. doe dit niet:

model.name = "item";

doe dit:

model.set("name", "item");

BEWERK:

Voor uw specifieke probleem is het mogelijk dat u naarJSON hebt gebeld voordat het model was geladen vanaf de server.

Bijv. Dit werkt niet altijd zoals verwacht:

var model = new Goal({id: 123});
model.fetch();
console.log(model.toJSON());

Maar dit zal:

var model = new Goal({id: 123});
model.fetch({
  success: function() {
    console.log(model.toJSON());
  }
});

27
2018-04-21 22:29