2011-06-07 26 views
34

giả sử tôi có:Làm thế nào để thiết lập url của một Bộ sưu tập

var Book = Backbone.Model.extend(); 

var Collection = Backbone.Collection.extend({ 
    model: Book, 
    url: '/books', 
    initialize: function(){ 
    this.fetch(); 
    }) 
}) 

Làm thế nào tôi có thể thay đổi Collection 's url khi instantiating một bộ sưu tập mới?

var AdventureBooks = new Books({ url: '/books/adventure' }) không hoạt động

var AdventureBooks = new Books({ category: 'adventure' }) 

và trong định nghĩa Bộ sưu tập:

url : '/books/' + this.category không hoạt động hoặc.

Cảm ơn.

Trả lời

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

này dường như không làm việc cho tôi (Backbone 0,5. 3). – harm

+1

lấy dấu ngoặc kép của chúng tôi trên "url" – Harry

+13

cũng, đây là thuộc tính được tìm nạp từ một mô hình. Điều gì về bạn sử dụng một url trên một bộ sưu tập? Đó là câu hỏi của OP. –

39

Sau đây nên làm việc:

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

Đối với một số lý do các thông số thông qua bộ sưu tập constructor (ví dụ như "url") không được thiết lập để các đối tượng. Bộ sưu tập chỉ sử dụng một vài trong số đó (mô hình và bộ so sánh).

Nếu bạn muốn vượt qua url qua constructor bạn cần tạo phương thức khởi rằng bản sao các thông số cần thiết cho các đối tượng:

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

Phương thức khởi tạo thực sự là: khởi tạo ([mô hình], [tùy chọn]) theo [tài liệu] (http://backbonejs.org/#Collection-constructor) –

+1

@DanielPatz: Bạn đang nghĩ về bộ sưu tập. Mô hình được inited với khởi tạo ([thuộc tính], [tùy chọn]). – geon

8

Giống như Daniel Patz pointed out, vấn đề nằm ở cách bạn đang instantiating bộ sưu tập. Tôi chỉ vật lộn với điều này một chút ngay bây giờ, vì vậy tôi nghĩ rằng tôi muốn cập nhật điều này, mặc dù câu hỏi là hơi cũ.

Đối số đầu tiên được mong đợi là một loạt các mô hình, với các tùy chọn sắp tới sau đó. Điều này sẽ hoạt động:

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

Nếu bạn muốn có URL động thì câu trả lời của Raynos có thể là cách để thực hiện.

+0

Đây là trường hợp của tôi, tôi đã cố gắng đặt url truyền đối tượng trong tham số đầu tiên 'sách mới ({url: '/ books/adventure'})' Cảm ơn bạn @Ruy Diaz –

+2

Dường như không hoạt động với Backbone 1.1 – Bjorn

+3

Có thể xác nhận, thao tác này không còn hoạt động nữa. – JayD3e

1

Tôi biết rằng câu trả lời trễ này, nhưng tôi đã có một tình huống tương tự mặc dù hơi phức tạp hơn và câu trả lời đã chọn không thực sự giúp tôi.

Tôi có bộ sưu tập Điều kiện và mỗi mô hình Thử nghiệm có nhiều điều kiện và tôi cần url của mình là/api/experiment /: experimentId/conditions, nhưng tôi không biết cách truy cập thí nghiệmId từ Điều kiện trống bộ sưu tập.

Trong hàm url bộ sưu tập Điều kiện của tôi, tôi đã thực hiện một console.log (this.toJSON()) và phát hiện Backbone chèn một mô hình giả trong bộ sưu tập trống với bất kỳ thuộc tính nào bạn đã chuyển vào lúc tạo thời gian.

vậy:

var Conditions = new ConditionsCollection({ 
    experimentId: 1 
}); 

tôi bằng cách nào đó nghi ngờ rằng điều này sẽ được coi là một thực hành tốt nhất, hy vọng ai đó sẽ trả lời với một giải pháp tốt hơn, nhưng đây là cách tôi định nghĩa Bộ sưu tập của tôi:

var ConditionsCollection = Backbone.Collection.extend({ 
    model: Condition, 
    url: function(){ 
    var experimentId = this.at(0).get("experimentId"); 
    return "/api/experiments/" + experimentId + "/conditions"; 
    } 
}); 
2

Giải pháp tốt nhất cho tôi là phương pháp khởi tạo, hãy xem ví dụ này:

Entities.MyCollection = Backbone.Collection.extend({ 
    model: Entities.MyModel, 
    initialize: function(models,options) { 
     this.url = (options||{}).url || "defaultURL"; 
    }, 
} 

sử dụng nó như sau:

var items = new Entities.MyCollection();      //default URL 
var items = new Entities.MyCollection([],{url:'newURL'}); //changed URL 
3

Nếu bạn muốn có url động cho bộ sưu tập của bạn, hãy thử này (thử nghiệm với xương sống 1.1.2):

Tạo một thể hiện của bộ sưu tập xương sống của bạn và vượt qua các tham số url động như một tùy chọn (đối tượng tùy chọn cần phải là đối số thứ hai là đối số đầu tiên là một mảng tùy chọn của mô hình):

Sau đó, bên trong bộ sưu tập của bạn, tạo một hàm url động sử dụng giá trị từ đối tượng tùy chọn:

var TweetsCollection = Backbone.Collection.extend({ 
    url: function() { 
     return '/api/tweets/' + this.options.userId; 
    }, 
    model: TweetModel 
}); 
0

Công việc này đối với tôi (thử nghiệm với xương sống 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); 
} 
}); 

sử dụng nó như sau:

var users = new serverData({dbname : 'users'}); 
Các vấn đề liên quan