Ответ 1
var Book = Backbone.Model.extend({
"url": function() {
return '/books/' + this.get("category");
}
});
скажем, у меня есть:
var Book = Backbone.Model.extend();
var Collection = Backbone.Collection.extend({
model: Book,
url: '/books',
initialize: function(){
this.fetch();
})
})
Как изменить Collection
url
при создании новой коллекции?
var AdventureBooks = new Books({ url: '/books/adventure' })
не работает
var AdventureBooks = new Books({ category: 'adventure' })
и в определении коллекции:
url : '/books/' + this.category
тоже не работает.
Спасибо.
var Book = Backbone.Model.extend({
"url": function() {
return '/books/' + this.get("category");
}
});
Следующее должно работать:
var AdventureBooks = new Books();
AdventureBooks.url = '/books/adventure';
По какой-то причине параметры, переданные конструктору Collection (например, url), не заданы для объекта. В коллекции используются лишь немногие из них (модель и компаратор).
Если вы хотите передать url через конструктор, вам нужно создать метод initialize, который копирует необходимые параметры объекту:
var Book = Backbone.Model.extend({
initialize: function(props) {
this.url = props.url;
}
}
var book = new Book({url: "/books/all"});
Как упоминал Даниэль Пац , проблема заключается в том, как вы создаете коллекцию. Я просто боролся с этим немного, поэтому я подумал, что обновляю это, хотя вопрос несколько старый.
Предполагается, что первый аргумент будет представлять собой массив моделей с последующими вариантами. Это должно работать:
var AdventureBooks = new Books([], { url: '/books/adventure' })
Если вам нужен динамический URL-адрес, тогда ответ Raynos может быть способом.
Если вы хотите иметь динамические URL-адреса для своей коллекции, попробуйте это (протестировано с помощью базовой системы 1.1.2):
Создайте экземпляр вашей основной сети и передайте параметр динамического url в качестве опции (объект options должен быть вторым аргументом, поскольку первый является дополнительным массивом моделей):
var tweetsCollection = new TweetsCollection(null, { userId: 'u123' });
Затем внутри вашей коллекции создайте динамическую функцию url, которая использует значение из объекта options:
var TweetsCollection = Backbone.Collection.extend({
url: function() {
return '/api/tweets/' + this.options.userId;
},
model: TweetModel
});
Лучшим решением для меня является метод инициализации, посмотрите на этот пример:
Entities.MyCollection = Backbone.Collection.extend({
model: Entities.MyModel,
initialize: function(models,options) {
this.url = (options||{}).url || "defaultURL";
},
}
используйте его следующим образом:
var items = new Entities.MyCollection(); //default URL
var items = new Entities.MyCollection([],{url:'newURL'}); //changed URL
Я знаю, что этот поздний ответ, но у меня была аналогичная, хотя и немного более сложная ситуация, и выбранный ответ мне действительно не помог.
У меня есть набор условий, и каждая модель эксперимента имеет несколько условий, и мне нужен мой url для /api/experimental/: experimentId/conditions, но я не знал, как получить доступ к эксперименту из пустой коллекции условий.
В моей функции url для сбора данных я сделал console.log(this.toJSON()) и обнаружил что Backbone вставляет одну пустую модель в пустую коллекцию с любыми атрибутами, которые вы передавали в это время создания.
так:
var Conditions = new ConditionsCollection({
experimentId: 1
});
Я почему-то сомневаюсь, что это будет считаться лучшей практикой, надеюсь, кто-то другой ответит лучшим решением, но вот как я определил свою коллекцию:
var ConditionsCollection = Backbone.Collection.extend({
model: Condition,
url: function(){
var experimentId = this.at(0).get("experimentId");
return "/api/experiments/" + experimentId + "/conditions";
}
});
Эта работа для меня (протестирована с основой 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);
}
});
используйте его следующим образом:
var users = new serverData({dbname : 'users'});