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

Параметры коллекции backbone.js

Я написал модель/представление/коллекцию с использованием Backbone.js. Моя коллекция использует метод выборки для загрузки моделей с удаленного сервера. Для этого набора, требуемого для этой коллекции, нужен id: messages/{id}. Но я не нашел чистого способа передать параметры коллекции.

Обратное backbone.js принимает параметры, передавая его при построении: view ([options]), но коллекция ожидает список моделей при построении: collection ([models]).

Что такое "самый чистый" способ передачи параметров/опций в эту коллекцию?

Сокращенный код:

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

Ответ 1

@Paul ответ хорош, но также стоит отметить, что атрибут url может быть функцией. По моему мнению (и это просто мнение, так как конечный результат тот же), код немного читабельнее, если более подробный, если вы установите id в initialize и ссылаетесь на него в функции:

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();

Просто, чтобы убедиться, что вы не путаете id здесь с Model id, не так ли? @Paul ответ и мой код выше, предположим, что у вас есть несколько коллекций Messages, каждый со своим собственным id. Если путь API /messages/<id> на самом деле ссылается на сообщение, а не на набор сообщений, тогда вам нужно только установить url в /messages/ в коллекции, а Backbone будет автоматически использовать /messages/<id> для каждой модели.

Ответ 2

Как указано свойство url, значение будет определено один раз, когда браузер сначала загрузит файл javascript, а "id" будет undefined.

Backbone.Collection принимает параметры как второй аргумент в своем конструкторе, поэтому вы можете передать значение id в качестве параметра, а затем установить значение url в функции инициализации коллекции.

Здесь пример

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();