2011-06-07 9 views
34

digamos que tengo:Cómo establecer la dirección URL de una colección

var Book = Backbone.Model.extend(); 

var Collection = Backbone.Collection.extend({ 
    model: Book, 
    url: '/books', 
    initialize: function(){ 
    this.fetch(); 
    }) 
}) 

¿Cómo puedo cambiar el Collection 's url cuando una instancia de una nueva colección?

var AdventureBooks = new Books({ url: '/books/adventure' }) no funciona

var AdventureBooks = new Books({ category: 'adventure' }) 

y en la definición Colección:

url : '/books/' + this.category tampoco funciona.

Gracias.

Respuesta

28
var Book = Backbone.Model.extend({ 
    "url": function() { 
    return '/books/' + this.get("category"); 
    } 
}); 
+0

Esto no parece funcionar para mí (Backbone 0.5. 3). – harm

+1

tome nuestras citas en "url" – Harry

+13

también, esta es una propiedad obtenida de un modelo. ¿Qué tal si usas una url en una colección? Esa fue la pregunta del OP. –

39

El siguiente debería funcionar:

var AdventureBooks = new Books(); 
AdventureBooks.url = '/books/adventure'; 
13

Por alguna razón los parámetros pasados ​​al constructor de colección (por ejemplo, "URL") no están fijados al objeto. La colección usa solo algunas de ellas (modelo y comparador).

Si desea pasar a través de la url constructor que necesita para crear método initialize que copia los parámetros necesarios para el objeto:

var Book = Backbone.Model.extend({ 
    initialize: function(props) { 
     this.url = props.url; 
    } 
} 
var book = new Book({url: "/books/all"}); 
+5

El método de inicialización es en realidad: inicializar ([modelos], [opciones]) según la [documentación] (http://backbonejs.org/#Collection-constructor) –

+1

@DanielPatz: Usted está pensando en la colección. El modelo está inited con initialize ([attributes], [options]). – geon

8

Como Daniel Patz pointed out, el problema radica en cómo se está instancias de la colección. Simplemente luché con esto por un momento en este momento, así que pensé en actualizar esto, a pesar de que la pregunta es algo antigua.

Se espera que el primer argumento sea una matriz de modelos, con las siguientes opciones. Esto debería funcionar:

var AdventureBooks = new Books([], { url: '/books/adventure' }) 

Si desea una URL dinámica, la respuesta de Raynos podría ser el camino a seguir.

+0

Este era mi caso, estaba tratando de configurar la url para pasar el objeto en el primer parámetro 'nuevos libros ({url: '/ books/adventure'})' Gracias @Ruy Diaz –

+2

Parece que no funciona con Backbone 1.1 – Bjorn

+3

Puede confirmar, esto ya no funciona. – JayD3e

1

Sé que esta es una respuesta tardía, pero tuve una situación similar aunque algo más complicada, y la respuesta seleccionada realmente no me ayudó.

Tengo una colección de Condiciones, y cada modelo de Experimento tiene varias condiciones, y necesitaba mi URL para ser/api/experiments /: experimentId/conditions, pero no sabía cómo acceder al experimentoId desde las Condiciones vacías colección.

En mi función url de recopilación de condiciones, realicé un console.log (this.toJSON()) y descubrí que Backbone inserta un solo modelo ficticio en la colección vacía con los atributos que pasó en su momento de creación.

manera:

var Conditions = new ConditionsCollection({ 
    experimentId: 1 
}); 

de alguna manera me cabe duda de que esto sería considerado una buena práctica, es de esperar que alguien va a responder con una solución mejor, pero así es como he definido mi Colección:

var ConditionsCollection = Backbone.Collection.extend({ 
    model: Condition, 
    url: function(){ 
    var experimentId = this.at(0).get("experimentId"); 
    return "/api/experiments/" + experimentId + "/conditions"; 
    } 
}); 
2

La mejor solución para mí es el método de inicialización, mire este ejemplo:

Entities.MyCollection = Backbone.Collection.extend({ 
    model: Entities.MyModel, 
    initialize: function(models,options) { 
     this.url = (options||{}).url || "defaultURL"; 
    }, 
} 

uso como sigue:

var items = new Entities.MyCollection();      //default URL 
var items = new Entities.MyCollection([],{url:'newURL'}); //changed URL 
3

Si usted quiere tener urls dinámicas para su colección, probar este (probado con espina dorsal 1.1.2):

crear una instancia de la colección de la columna vertebral y pasar el parámetro url dinámica como una opción (las opciones objeto necesita ser el segundo argumento que el primero es un conjunto opcional de los modelos):

var tweetsCollection = new TweetsCollection(null, { userId: 'u123' }); 

luego dentro de su colección, crear una función url dinámica que utiliza el valor de la objeto de opciones:

var TweetsCollection = Backbone.Collection.extend({ 
    url: function() { 
     return '/api/tweets/' + this.options.userId; 
    }, 
    model: TweetModel 
}); 
0

Este trabajo para mí (probado con columna vertebral 1.2.1):

var serverData = Backbone.Collection.extend({ 
url: function() { 
    return '//localhost/rest/' + this.dbname; 
}, 
constructor: function(a) { 
    if(a.dbname){ 
     this.dbname = a.dbname; 
    } 
    Backbone.Collection.apply(this, arguments); 
} 
}); 

utilizan como sigue:

var users = new serverData({dbname : 'users'}); 
Cuestiones relacionadas