Атрибут коллекции магистрального набора (для URL) - PullRequest
6 голосов
/ 18 июля 2011

Мне нужно передать идентификатор в коллекцию для использования в URL (например, /user/1234/projects.json), но я не уверен, как это сделать, пример был бы замечательным.

То, как мое приложение структурируется при запуске, коллекция «пользователей» извлекается и отображается. Я хочу, чтобы при нажатии пользователем его «документы» извлекались с сервера в новую коллекцию и отображались в новом виде , Проблема заключается в получении идентификатора пользователя в коллекции документов, чтобы дать соответствующий URL для documents.fetch ().


думаю, я понял, вот пример:

  //in the the view initialize function     
  this.collection = new Docs();
  this.collection.project_id = this.options.project_id;
  this.collection.fetch();

  //in the collection
  url: function() {
     return '/project/api/' +this.project_id+'/docs';
  }

Ответы [ 3 ]

7 голосов
/ 18 июля 2011

Ваш URL коллекции пользователей должен быть установлен в / user. Как только это установлено, ваши модели должны использовать этот URL, чтобы творить свою магию. Я считаю (не совсем уверенным), что если модель находится в коллекции, вызов метода 'url' вернет / user /: id. Таким образом, все ваши типичные функции REST-ish будут использоваться в '/ user /: id'. Если вы пытаетесь что-то сделать с отношениями (у пользователя много документов), это как бы промыть и повторить. Таким образом, для вашей коллекции документов (какие записи должны быть правильными для пользователя?) Вы должны установить URL 'user_instance.url / documents'.

Чтобы показать связь «один ко многим» с моделью магистрали, вы должны сделать что-то вроде этого (обновить до версии 0.5.1 магистрали для urlRoot):

var User = Backbone.Model.extend({
    initialize: function() {
        // note, you are passing the function url.  This is important if you are
        // creating a new user that's not been sync'd to the server yet.  If you
        // did something like: {user_url: this.url()} it wouldn't contain the id
        // yet... and any sync through docs would fail... even if you sync'd the
        // user model!
        this.docs = new Docs([], {user_url: this.url});
    },
    urlRoot: '/user'
});

var Doc  = Backbone.Model.extend();

var Docs = Backbone.Collection.extend({
    initialize: function(models, args) {
        this.url = function() { args.user_url() + '/documents'; };
    }
});

var user = new User([{id: 1234}]);
user.docs.fetch({ success: function() { alert('win') });
5 голосов
/ 19 июля 2011

Зачем вам нужно переопределить свойство URL коллекции с помощью функции? .. вы можете сделать:

 this.collection = new Docs();
 this.collection.project_id = this.options.project_id;
 this.collection.url = '/project/api/' + this.options.project_id + '/docs';
 this.collection.fetch();
0 голосов
/ 19 марта 2014

Мне нравится ответ от Крейга Монсона, но чтобы он заработал, мне нужно было исправить две вещи:

  • Привязка метода URL пользователя перед его передачей в Документы
  • Оператор возврата из функции url в Документах

Обновленный пример:

var User = Backbone.Model.extend({
    initialize: function() {
        // note, you are passing the function url.  This is important if you are
        // creating a new user that's not been sync'd to the server yet.  If you
        // did something like: {user_url: this.url()} it wouldn't contain the id
        // yet... and any sync through docs would fail... even if you sync'd the
        // user model!
        this.docs = new Docs([], { user_url: this.url.bind(this) });
        },
        urlRoot: '/user'
    });

var Doc  = Backbone.Model.extend();

var Docs = Backbone.Collection.extend({
    initialize: function(models, args) {
        this.url = function() { return args.user_url() + '/documents'; };
    }
});

var user = new User([{id: 1234}]);
user.docs.fetch({ success: function() { alert('win') });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...