2012-01-20 666 views
11

Tengo una pregunta sobre el manejo de mis modelos. Me confundo todo. Cuando cargo la página obtengo una cadena JSON de los rieles que contienen "eventos", estos eventos tienen a su vez un usuario, múltiples participantes, múltiples pagos y múltiples comentarios, estos comentarios, tienen a su vez un usuario, y los pagos tienen múltiples usuarios y un usuario unico. Los comentarios y pagos también tienen un evento que apunta hacia el padre.Modelos en Backbone.js

Events 
    User 
    Participants(users) 
    Payments 
    User 
    Users 
    Event 
    Comments 
    User 
    Event 

Okey, así que la pregunta es: ¿Debo cargar todo como un árbol, con los atributos completos en todas partes:

"events": { 
    "id": "event_1", 
    "user": { 
    "id": "user_1", "name":"name" 
    }, "participants": [ 
    {"id": "user_1", "name":"name"}, 
    {"id": "user_2", "name":"name"} 
    ], "payments": [{ 
     "id":"payment_1", 
     "user": { 
     "id": "user_1", "name":"name" 
     },"users": [ 
     {"id": "user_1", "name":"name"}, 
     {"id": "user_2", "name":"name"} 
     ], "event": {root event object} 
    }], "comments": [{ 
     "id": "comment_1", 
     "user": { 
     "id": "user_1", "name":"name" 
     }, "event": {root event object} 
    }] 
    } 
} 

y luego tener el modelo de eventos, para crear nuevos comentarios, los pagos y los usuarios, y asignarlo a su propio evento, o es una mejor idea cargar cada evento, pago del usuario y comentar en variables separadas, y luego usar la variable para obtener los modelos. Es bastante difícil de explicar, así que no dude en preguntar si necesito aclarar algo.

Conclusión: ¿Debo dejar que el modelo de eventos maneje la creación de todos los objetos anidados, o hay alguna forma mejor de manejar esto, y tener acceso a los modelos más globalmente?

+3

Es posible que desee estudiar el uso de [backbone-relational] (https://github.com/PaulUithol/Backbone-relational) y tener un modelo para el usuario, los participantes, los eventos, etc. tratándolos de manera similar, ya puede hacerlo. hacer en ruby-on-rails –

Respuesta

9

La arquitectura es subjetiva, pero aquí es cómo iba a ir sobre ella -

3 modelos base

User = Backbone.Model.extend({ 
    defaults : { 
     name : "" 
    } 
}) 
Payment = Backbone.Model.extend({ 
    defaults : { 
     user : new User(), 
     users : new UserList(), 
     event : "" 
    } 
}) 
Comment = Backbone.Model.extend({ 
    defaults : { 
     user : new User(), 
     event : "" 
    } 
}) 

3 Colecciones

UserList = Backbone.Collection.extend({ 
    model : User 
}) 
PaymentList = Backbone.Collection.extend({ 
    model : Payment 
}) 
CommentList = Backbone.Collection.extend({ 
    model : Comment 
}) 

Un modelo de eventos

Event = Backbone.Model.extend({ 
    defaults : { 
     user : new User(), 
     participants : new UserList(), 
     payments : new PaymentList(), 
     comments : new CommentList() 
    } 
}) 

Si inicializa su objeto de evento con el JSON en el ejemplo anterior, debería funcionar. En el futuro, si desea separar a sus usuarios en una API diferente, este código también debería ser compatible. Si usted quiere hacer que los objetos disponibles a nivel mundial el componente más adelante, sólo puede conseguirlo a partir del objeto de usuario, es decir, window.User = myEvent.get ("usuario")

Espero que esto ayude :)

3

No lo haría. Mantendría los rieles del lado lo más simple posible con llamadas a objetos específicos. Sí, significa que hará más llamadas para obtener la imagen completa, pero en última instancia, será más fácil de mantener y los cambios en un objeto no requerirán cambios en cascada en muchos otros. Por ejemplo, ¿qué sucede si, además del nombre, necesita agregar otros atributos de usuario?

En otras palabras, el evento es solo eso, un objeto de evento. Se refiere a otros objetos por id. Cada uno de esos objetos tiene sus propias clases de modelo y URL de API correspondientes. Por lo tanto, necesitaría obtener el objeto de usuario de la API siempre y cuando sea necesario (por id).

Cuestiones relacionadas