Подтвердить что ты не робот

Как установить URL-адрес коллекции

скажем, у меня есть:

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 тоже не работает.

Спасибо.

4b9b3361

Ответ 1

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

Ответ 2

Следующее должно работать:

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

Ответ 3

По какой-то причине параметры, переданные конструктору Collection (например, url), не заданы для объекта. В коллекции используются лишь немногие из них (модель и компаратор).

Если вы хотите передать url через конструктор, вам нужно создать метод initialize, который копирует необходимые параметры объекту:

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

Ответ 4

Как упоминал Даниэль Пац , проблема заключается в том, как вы создаете коллекцию. Я просто боролся с этим немного, поэтому я подумал, что обновляю это, хотя вопрос несколько старый.

Предполагается, что первый аргумент будет представлять собой массив моделей с последующими вариантами. Это должно работать:

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

Если вам нужен динамический URL-адрес, тогда ответ Raynos может быть способом.

Ответ 5

Если вы хотите иметь динамические 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
});

Ответ 6

Лучшим решением для меня является метод инициализации, посмотрите на этот пример:

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

Ответ 7

Я знаю, что этот поздний ответ, но у меня была аналогичная, хотя и немного более сложная ситуация, и выбранный ответ мне действительно не помог.

У меня есть набор условий, и каждая модель эксперимента имеет несколько условий, и мне нужен мой 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";
  }
});

Ответ 8

Эта работа для меня (протестирована с основой 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'});