2011-08-25 23 views
13

sto usando backbone.jsbackbone.js - movimentazione relazioni modello in modo RESTful

Per esempio, supponiamo che abbiamo un modello di "prodotti" e un modello "categorie", che hanno una relazione molti-to- molte relazioni In una delle mie opinioni, dico che ho bisogno di recuperare un elenco di tutte le categorie e sapere se ognuna è correlata al modello di prodotto corrente.

Devo impostare una raccolta "categoria" e avere una proprietà del mio modello e in qualche modo dargli accesso all'id del modello in modo che quando viene recuperato, ottiene solo le categorie correlate? E poi potrei prendere tutte le categorie e incrociarle per esaminarle per vedere quali sono correlate pur avendo quelle che non lo sono?

Non ho idea di quale sarebbe il modo migliore per farlo. Sono abituato ad usare un ORM che rende facile sul lato server.

risposta

13

Check out backbone-relational.

+1

Idem backbone-relazionale. È un peccato non fare parte dello sviluppo principale di Backbone. –

0

Supponendo che si sta utilizzando una tabella di join sul backend:

creare una collezione e un modello contenente tutte le righe sulla vostra tavola unire e aggiungere i seguenti metodi per la raccolta: productsByCategory e categoriesByProduct (utilizzando [unirsi collezione] .dove (...).)

Avere dati in Backbone che rispecchiano i dati nel back-end sembra aiutare a mantenere le cose semplici e non dovrai fare nulla di complicato quando imposti gli URL.

5

C'è una semplice soluzione personalizzabile & per questo, anche se potrebbe non essere robusta come backbone-relational.

Backbone.ModelWithRelationship = Backbone.Model.extend({ 
    mappings: {}, 

    set: function(attributes, options) { 
    _.each(this.mappings, function(constructor, key) { 
     var RelationshipClass = stringToFunction(constructor); 
      var model = new RelationshipClass(); 

     /* New relational model */ 
      if (!this.attributes[key]) { 
     this.attributes[key] = (model instanceof Backbone.Collection) ? model : null; 
      } 

      /* Update relational model */ 
      if (attributes[key] && !(attributes[key] instanceof Backbone.Model || attributes[key] instanceof Backbone.Collection)) { 
     if (model instanceof Backbone.Model) { 
      this.attributes[key] = model; 
      this.attributes[key].set(attributes[key], options);   
     } else if (model instanceof Backbone.Collection) { 
      this.attributes[key].reset(attributes[key], options);   
     } 

     delete attributes[key]; 
      } 
    }, this); 

    return Backbone.Model.prototype.set.call(this, attributes, options); 
    } 
}); 

È possibile dichiarare la mappatura solo con la creazione di una sottoclasse di Backbone.ModelWithRelationship.

Models.Post = Backbone.ModelWithRelationship.extend({ 
    mappings: { 
    'comments': 'Collection.CommentCollection', 
    'user': 'Models.User' 
    } 
}); 
1

http://pathable.github.com/supermodel/ è fantastico. Ti facciamo fare cose del tipo:

Post.has().many('comments', { 
    collection: Comments, 
    inverse: 'post' 
}); 

Comment.has().one('post', { 
    model: Post, 
    inverse: 'comments' 
}); 

var post = Post.create({ 
    id: 1, 
    comments: [{id: 2}, {id: 3}, {id: 4}] 
}); 

post.comments().length; // 3 
var comment = Comment.create({id: 5, post_id: 1}); 
post.comments().length; // 4 
comment.post() === post; // true :D 
+0

Sto trovando la supermodella molto più semplice e al punto di una struttura portante-relazionale. Ha un design intelligente che conserva ogni istanza di un modello nella propria collezione come punto centrale di archiviazione che rimane fresco. –