2012-06-03 15 views
11

Estoy atascado con la forma de diseñar mi aplicación backbone.js con respecto a mis relaciones modelo.Cómo manejar las relaciones en backbone.js

Si tengo un modelo de evento, que tiene un par de relaciones, digamos que un modelo de usuario puede tener muchos eventos y el modelo de evento a su vez puede tener muchos comentarios y participaciones. Un usuario puede tener muchos comentarios y la participación puede tener un usuario y un evento. Wow, ¡qué desastre!

Event has many Comments 
Event has many Participations 
Event has one User 

User has many Events 
User has many Participations 
User has many Comments 

Comment has one Event 
Comment has one User 

Participation has one User 
Participation has one Event 

Okey, así que mi idea era cargar una lista de eventos cuando el usuario carga la página, y cuando un usuario hace clic en un evento de carga del resto de la información acerca de ese evento (comentarios, participaciones y usuario) .

Así que la pregunta es, ¿debería utilizar algún tipo de variable global para contener todos los eventos, los usuarios y así sucesivamente, y cuando me agarra la información desde el servidor puesto ahí (y comprobar allí antes de que yo agarro algo del servidor) , tal vez en algún tipo de almacenamiento local (y ¿cómo hago esto usando backbone-relational?).

Otra idea que he tenido es permitir que cada evento tenga sus propios datos independientes, el problema con esto es que probablemente enviaré datos redundantes cada vez que haga clic en un evento.

¿De qué manera me recomiendan?

gracias!

Respuesta

0

En teoría, podría cargar todas las colecciones independientes y luego utilizar el filtrado local en las colecciones para obtener los modelos relevantes cuando realice su renderizado.

Tiene que considerar los problemas de seguridad con esto, por supuesto.

No estaba exactamente claro, al menos para mí, de su pregunta de qué va a hacer con la información que obtiene, pero intentaré responder lo mejor que pueda.

Mi hipótesis es que tiene algún tipo de evento con algunos datos adicionales y debe mostrar la información relacionada con esto. A continuación, también tiene que ser capaz de hacer cosas como añadir comentarios, etc.

Como ya he dicho, usted podría considerar la siguiente manera:

var Events = Backbone.Collection.extend({ 
    url: '/events', // You might want to let the app return only an account's events or something, not just ALL events. 
    initialize: function(){ 
     this.fetch(); 
    } 
}); 

var Comments = Backbone.Collection.extend({ 
    url: '/comments', 
    initialize: function(){ 
     _.bindAll(this, 'getEventComments'); 
     this.fetch(); 
    }, 

    getEventComments: function(event_id){ 
     return _.filter(this.models, function(model){ return model.get('event_id') == event_id; }); 
    } 
}); 
//etc 

Mediante el uso de la función de filtro de guión bajo se puede llegar muy rápidamente el relevante modelos cada vez que los necesite (por ejemplo, cuando renderiza).

En cierto modo, esto es lo mismo que en las secuencias de comandos del lado del servidor. Algunas bases de datos guardan todas sus tablas con registros, como lo harán sus colecciones aquí, y su código simplemente le pide a la base de datos las relevantes basadas en algunas entradas.

Por último, siempre voy a seguir señalando Require.js en combinación con Backbone a las personas. Sin vergüenza refiriéndose a una respuesta que he dado hoy, comprobar que funciona, lo que facilitará la vida no importa qué: Backbone Design

18

Como @mu_is_too_short comentado, Backbone-relacional podría ser algo que usted está interesado en estudiar. Con Backbone-relational sus modelos y colecciones de submodelos se crean automáticamente y los eventos se pueden administrar a través de la relación padre-hijo.

Le daré un código de muestra para que pueda probarlo. Parte de su código de ejemplo podría verse más o menos así.

usuario tiene muchos eventos:

User = Backbone.RelationalModel.extend({ 
    relations: [ 
     type: Backbone.HasMany, // Type of relationship 
     key: 'events',   // How we reference the sub-models in collection 
     relatedModel: 'Event', // The sub-model type 
     collectionType: 'EventCollection', // The sub-model collection 
     reverseRelation: { 
      key: 'belongsToUser'   // Key we use to refer to the parent 
     } 
    ], 
    // Other Backbone.Model properties and functions 
}); 

Cuando se crea un modelo relacional-Backbone, crea automáticamente un conjunto de submodelos para que el nombre de la 'llave' que se designe. De modo que cada usuario que tenga tendrá su propia colección de eventos relacionados ordenados.

Básicamente, cuando crea o busca al usuario, le da referencias a los modelos relacionados que necesita. Entonces, por ejemplo, su ID de usuario = 1 podría necesitar el Evento 5, 7 y 11. (Solo estoy usando ID). Siempre que estas referencias se definan en forma de matriz, puede cargarlas de forma perezosa utilizando los métodos Relational fetchRelated.

myUser = new User(); 
myUser.set({ 
    name: 'RayMysterio', 
    age: '26', 
    events: [5, 7, 11] // Or this might just come with the User object from your server 
}); 

myUser.fetchRelated('events'); 
// This will go fetch the related events for this user model from the URL you designate. 

myUser.get('events'); 
// The collection of events are treated like an attribute of the User model. 

myUser.get('events').find(function(eventModel){ 
    return // some find condition - or whatever you want to do on that collection 
}); 

Es posible que desee vincular ciertos oyentes a los submodelos.

myUser.bind('add:events', function(model, collection) { 
    // Whatever code you want to happen when new models are added to the user events coll 
}); 

Etc. Etc.

Es una buena manera de producir uno a uno, uno a muchos, y las relaciones inversas. Esto es bastante clave. Cuando define una relación entre modelos y crea un modelo.

E.g. usted crea una nueva instancia de modelo de Usuario.

Backbone-relational crea automáticamente el enlace inverso (el modelo de evento tiene un atributo definido por la clave de relación inversa 'belongsToUser' (o lo que sea). Esto hace que sea muy útil recorrer arriba y abajo el modelo/sub- jerarquía del modelo.

sobre la base de sus necesidades relacionales esto parece un buen ajuste.

Si desea muchos a muchos, hay un camino de ida y acerca de hacerlo (usando modelos intermedios) pero he encontrado esto es poco convincente y lo evito. Paul-Uithol ha estado actualizando Backbone-Relational por un tiempo y las nuevas características se siguen sumando. La curva de aprendizaje fue un poco difícil para mí al principio, pero una vez que empiezas acostumbrarse es muy útil.

NOTA: Para enfatizar, Mosselman recomendó Require.js y también estoy totalmente de acuerdo con esto. Ha hecho que mi código sea mucho más manejable. Puede ajustar (ajustar) el código relacional Backbone para que sea compatible con AMD y funciona sin problemas con Require.

ACTUALIZACIÓN: columna vertebral-relacional ahora es compatible con require.js partir de la versión 0.8.8 el 1 de abril 2014 - gracias Kenneth

+0

¿Es posible relacionar eventos al usuario a través de un modelo de eventos? 'myUser.set ('events', [myEvent1, myEvent2, myEvent3]);' algo así? ¿O tiene que hacer referencia a la relación a través del id del modelo relacionado? –

+1

@orangewarp backbone-relational ahora es compatible con require.js a partir del lanzamiento 0.8.8 el 1 de abril de 2014. Ver http://backbonerelational.org/#change-log – Kenneth

Cuestiones relacionadas