1

ich für die richtige Backbone-Struktur suchen die folgenden zu erreichen:Beziehungen zwischen den Modellen in Backbone.js

Zwei-Server-APIs:

  • GET api/event/4: gibt das Ereignisobjekt mit der ID 4.
  • GET api/event/4/registrations: gibt die Liste der Objekte Registrierung Ereignis gehören, mit der ID 4

ich einen Blick wollen Objekt das Ereignis angezeigt wird und die Liste der Registrierungen.

Das ist sehr einfach, aber ich kann nicht herausfinden, wie man meine Event und Registration Modelle organisiert. Sollte ich Backbone-relational verwenden?

Mein Ereignismodell ist derzeit wie folgt: (die Sammlung wird voraussichtlich die nächsten 10 Ereignisse von jetzt an enthalten).

Wie sollte ich mein Registrierungsmodell definieren und wie initialisiere ich es, obwohl ich weiß, dass es immer im Zusammenhang mit einem Ereignismodell steht?

var app = app || {}; 

app.EventModel = Backbone.Model.extend({ 
    urlRoot: app.API_server + 'event' 
}); 


app.EventCollection = Backbone.Collection.extend({ 
    model: app.EventModel, 
    url: app.API_server + 'event', 
    initialize: function(){ 
     dt = new Date(); 
     start_dt = dt.toISOString(); 
     this.fetch({ 
      data: {limit:10, start_dt:start_dt}, 
      error: function (model, response, options) { 
       if(response.status == '403') { 
        app.Session.logout(); 
       } 
      } 
     }) 
    } 
}); 

Antwort

2

Machen Sie eine Sammlung für die Registrierung und verwenden Sie die url Eigenschaft als Funktion. Standardmäßig sind die urlRoot der Modelle der RegistrationCollection die url der Sammlung mit ihren id angehängt.

app.RegistrationCollection = Backbone.Collection.extend({ 
    url: function() { 
     return app.API_server + 'event/' + this.id + '/registrations'; 
    }, 
    initialize: function(models, options) { 
     options = options || {}; 
     this.id = options.id; 
    } 
}); 

Dann auf EventModel Initialisierungseinrichtung, eine RegistrationCollection als Eigenschaft hinzufügen, um das Ereignis zu der Sammlung id Gabe als Option.

app.EventModel = Backbone.Model.extend({ 
    urlRoot: app.API_server + 'event', 
    initialize: function() { 
     this.registrations = new app.RegistrationCollection(null, { 
      id: this.id 
     }); 
    } 
}); 

die fetch von der init entfernen, möchten Sie Ihre Sammlung wiederverwendbar machen.

Rufen Sie die Ansicht oder den Router ab, je nachdem, wo es für Ihre App sinnvoller ist.

var EventView = Backbone.View.extend({ 

    initialize: function() { 
     this.collection = new app.EventCollection(); 
     var dt = new Date(), 
      start_dt = dt.toISOString(); 

     // this should be here, outside of the collection. 
     this.collection.fetch({ 
      data: { limit: 10, start_dt: start_dt }, 
      error: function(model, response, options) { 
       if (response.status === 403) { 
        app.Session.logout(); 
       } 
      } 
     }); 
    }, 
}); 
Verwandte Themen