2013-07-04 25 views
9

Từ hiểu biết của tôi, hành vi mặc định của Mô hình cột sống JS là trả về URL của Bộ sưu tập, trừ khi mô hình có chỉ định urlRoot. Tôi không thể có được hành vi để làm việc.BackboneJS model.url bằng cách sử dụng collection.url

Từ các tài liệu:

model.url() ... Tạo URL có dạng: "[collection.url]/[id]" theo mặc định, nhưng bạn có thể ghi đè lên bằng cách xác định một rõ ràng urlRoot nếu bộ sưu tập của mô hình không được tính đến.

Dưới đây là bộ sưu tập của tôi, và mô hình tương ứng:

var MyCollection = Backbone.Collection.extend({ 
    model: Model, 
    initialize: function(options){ 
     this.options = options || {}; 
    }, 
    url: function(){ 
     return "/theurl/" + this.options.param; 
    } 
}); 
return MyCollection; 

...

var MyModel = Backbone.Model.extend({ 
    urlRoot: '/theurl', 
    initialize: function() { 
    } 
}); 
return MyModel; 

Khi một mô hình được nạp mà không có một bộ sưu tập, nó hoạt động tuyệt vời và nộp để /theurl, nhưng khi được tải vào bộ sưu tập, tất cả các phương thức sẽ gửi đến /theurl/param/.

Nếu tôi hiểu tài liệu chính xác, thì urlRoot của Mô hình sẽ ghi đè hành vi này; và thậm chí sau đó url của mô hình phải là /theurl/param/{MODEL-ID}.

Bất kỳ ý tưởng nào về những gì tôi thiếu/hiểu lầm?

...

PS: Các model: Model từ bộ sưu tập được đưa vào qua RequireJS

Trả lời

9

Nó sẽ luôn luôn sử dụng url của bộ sưu tập ngay cả khi bạn có urlRoot quy định.

Lý do cho urlRoot là vì vậy bạn có thể sử dụng nó để ghi đè hoặc nếu mô hình xảy ra không nằm trong bộ sưu tập (ví dụ: có thể bị xóa nhưng vẫn tồn tại trên máy khách).

Vì vậy, nếu bạn muốn fetch hoặc save mô hình và ghi đè url được tạo bởi bộ sưu tập, bạn cần phải chuyển các phương thức này một cách rõ ràng như một tùy chọn. Ví dụ:

yourModel.save({ url: yourModel.urlRoot }); 

Tôi đồng ý rằng tài liệu này rất khó hiểu và điều này cũng khiến tôi phát hiện ra.

+0

Cảm ơn cho câu trả lời. Tài liệu có vẻ siêu mơ hồ ở đó. Bất kỳ ý tưởng nào về lý do tại sao nó không thêm ID mô hình vào cuối URL thu thập? – caleb

+0

Có một vài điều. Bạn vừa tạo mô hình trên máy khách chưa? Nếu vậy nó sẽ không nhất thiết phải có một id vì nó chưa được lưu vào máy chủ. Trong trường hợp này, nó sẽ chỉ có một cId. – dcarson

+2

Tôi nghĩ rằng điều này thay vào đó nên nói: 'yourModel.save ({}, {url: yourModel.urlRoot});'. Cách nó hiện đang được viết sẽ là 'set' thuộc tính' url' trên đối tượng vì đối số đầu tiên là 'save' là một thuộc tính hash. – flyingL123

1

UrlRoot phải là hàm và mô hình phải được định nghĩa attributeId. Nếu bạn xác định mô hình của bạn như thế này tất cả các hoạt động sẽ được làm việc nếu mô hình là trong bộ sưu tập hay không.

Xương sống thêm modelId ở cuối URL được trả về bởi hàm urlRoot.

var MyModel = Backbone.Model.extend({ 
    attributeId: 'myModelId' 
    urlRoot: function() { 
     return '/theurl'; 
    }, 
    initialize: function() { 
    } 
    defaults: { 
     myModelId: null 
    } 
}); 
+0

Tôi vừa thử nghiệm điều này bằng cách đặt 'urlRoot' làm hàm thay vì chuỗi và không sử dụng hàm' urlRoot' của mô hình khi mô hình nằm trong bộ sưu tập và 'lưu' được gọi trên mô hình. – dcarson

+0

nếu mô hình đang được thu thập thì url bộ sưu tập được sử dụng. urlRoot chỉ khi mô hình nằm ngoài bộ sưu tập. – maketest

+0

Chính xác! Hành vi đó là điều mà người hỏi câu hỏi đang hỏi về điều đó là bất ngờ với anh ta/cô ấy. Tài liệu là khó hiểu và nó cho thấy rằng thiết lập 'urlRoot' sẽ có nghĩa là mô hình ** luôn luôn ** sử dụng urlRoot, ngay cả khi nó trong một bộ sưu tập. Như tôi đã nói trong câu trả lời của tôi và bạn vừa nói trong bình luận của bạn, đây không phải là trường hợp thực sự. – dcarson

0

Trong mô hình, hãy thử sử dụng:

url: function() { 
    return 'your url goes here'; 
} 
Các vấn đề liên quan