2011-12-11 21 views
44

He escrito un modelo/vista/colección usando Backbone.js. Mi colección usa el método fetch para cargar los modelos desde un servidor remoto. La URL requerida para esta colección necesita una identificación como: messages/{id}. Pero no he encontrado una forma clara de pasar opciones a la Colección.Opciones de la colección Backbone.js

La vista backbone.js acepta opciones al pasarla a la construcción: vista ([opciones]), pero la colección espera una lista de modelos al momento de la construcción: colección ([modelos]).

¿Cuál es la forma más "limpia" de pasar los parámetros/opciones a esta colección?

código acortada:

var Messages = Backbone.Collection.extend({ 
model: Message, 
    url: 'http://url/messages/' + id 
}); 
+4

¿Quizás usar una URL relativa es una mejor idea también? – malletjo

Respuesta

107

@ respuesta de Pablo es bueno, pero también digno de mención que el atributo url puede ser una función. En mi opinión (y es sólo una opinión, ya que el resultado final es el mismo), el código es un poco más legible, si más detallado, si se establece el id en initialize y la referencia en una función:

var Messages = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
    this.id = options.id; 
    }, 
    url: function() { 
    return '/messages/' + this.id; 
    }, 
    model: Message, 
}); 

var collection = new Messages([], { id: 2 }); 
collection.fetch(); 

Solo para asegurarse, sin embargo, no confunde el id aquí con el Modelo id, ¿verdad? La respuesta de @ Paul, y mi código anterior, asumen que tiene múltiples colecciones Messages, cada una con su propia identificación. Si la ruta API /messages/<id> se refiere realmente a un mensaje , no es un conjunto de mensajes, entonces solo necesita establecer url en url en /messages/ en la Colección, y Backbone usará automáticamente /messages/<id> para cada modelo.

+3

Gracias 'Nick' por un ejemplo tan simple y claro. Ojalá pudiera haber visto tu respuesta, me habría salvado un día ... Gracias de nuevo. – Shubh

+0

Sí, esto resulta en undefined para mí. La respuesta a continuación funciona. –

23

La forma que tiene la propiedad url declarado, el valor se determinará una vez cuando el navegador inicialmente carga el archivo JavaScript, y será indefinido 'id'.

Backbone.Collection acepta opciones como el segundo argumento en su constructor, por lo que puede pasar el valor de id como una opción y luego establecer el valor de la URL dentro de la función de inicialización de la colección.

He aquí un ejemplo

var Messages = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
    this.url = 'http://url/messages/' + options.id; 
    }, 
    model: Message, 
}); 

var collection = new Messages([], { id: 2 }); 
collection.fetch(); 
Cuestiones relacionadas