2011-07-18 1 views
6

Potrzebuję przekazać identyfikator do kolekcji do użycia w adresie URL (np. /user/1234/projects.json), ale nie jestem pewien, jak to zrobić, przykład może być wspaniale.Atrybut kolekcji zestawu szkieletowego (dla adresu URL)

Sposób, w jaki moja aplikacja jest zorganizowana, po uruchomieniu kolekcja "użytkowników" jest wyciągnięta i renderowana, wtedy chcę, aby po kliknięciu użytkownika ich "dokumenty" zostały przeniesione z serwera do nowej kolekcji i renderowane w nowym widok. Problem polega na pobraniu identyfikatora użytkownika do zbioru dokumentów, aby podać odpowiedni adres URL dla documents.fetch().


pomyśleć Mam go, oto przykład:

//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'; 
    } 
+0

pracował dla mnie. Dzięki! –

Odpowiedz

7

Twoja kolekcja url użytkownik powinien być ustawiony/użytkownika. Gdy już to zrobisz, twoje modele powinny wykorzystać ten URL, aby zrobić swoją magię. Uważam (nie całkiem pozytywnie), że jeśli model jest w kolekcji, wywołanie metody "url" zwróci/user /: id. Tak więc cała twoja typowa funkcja REST-ish będzie używana na "/ user /: id". Jeśli próbujesz zrobić coś ze związkiem (użytkownik ma wiele dokumentów), to jest to rodzaj płukania i powtarzania. Tak więc, w przypadku zbierania dokumentów (które uwiarygodnia użytkownik?), Ustaw adres URL na "user_instance.url/documents".

Aby pokazać jeden do wielu relacji z modelem szkieletowej, chcesz zrobić coś takiego (upgrade do szkieletu 0.5.1 dla 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') }); 
+0

Dzięki, jest jeden dla wielu. Nie wiem, jak uzyskać "user_instance" w kolekcji dokumentów (dodałem przykład do głównego pytania). –

+0

Myślę, że rozumiem teraz ... dodany przykład. –

+0

2 lata później i jest to nadal istotne i bardzo dobry sposób na oddzielenie adresów URL modeli. Szczególnie podoba mi się sposób, w jaki model Dokumentów jest odpowiedzialny za dodanie/dokumentów do adresu URL. The Backbone FAQ sugeruje, że jest to odpowiedzialność modelu użytkownika, ale nie zgadzam się - IMO w ten sposób jest czystsze. – fiznool

5

Dlaczego trzeba zastąpić właściwość URL ? kolekcji z funkcją .. można zrobić:

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

To jest najlepsze rozwiązanie. – SeanK

0

lubię odpowiedź od Craig Monson, ale aby to działa musiałem ustalić dwie rzeczy:

  • Oprawa metody url użytkownika przed przekazaniem go do Dokumentów
  • instrukcji return z funkcji URL w Dokumentach

Aktualizacja przykład:

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') });