2012-07-27 52 views
12

Tôi có Model sau:backbone.js thay đổi tham số url của một mô hình và lấy không cập nhật dữ liệu lấy

window.MyModel = Backbone.Model.extend({ 
    initialize: function(props){ 
      this.url = props.url; 
    } 

    parse: function(){ 

      // @override- parsing data fetched from URL 
    } 


}); 

// instantiate 
    var mod = new MyModel({url: 'some/url/here'}); 

tôi sử dụng biến toàn cầu này 'mod' để lấy một số dữ liệu vào mô hình này từ backend.

// fetch 

mod.fetch({ 
     success: function(){ ...}, 
     error: ... 

}); 

Tất cả ở trên hoạt động tốt .... My Vấn đề: Tôi muốn sử dụng lại mô hình này bằng cách thay đổi thiết lập lại url và gọi lấy nhưng nó không cập nhật các url bằng cách nào đó. Tôi đã thử các cách sau:

mod.fetch({ 
     data: {url:'/some/other/url'}, 
     postData: true, 
     success: function(){ //process data}, 
     error: ... 
    }); 


mod.set({url: '/some/other/url'}); 
// called fetch() without data: and postData: attributes as mentioned in previous 

Làm cách nào để đặt url cho mô hình của mình để tôi có thể gọi hàm fetch() và tìm nạp dữ liệu từ url được cập nhật? Tui bỏ lỡ điều gì vậy. Thanks cho bất kỳ con trỏ ..

UPDATE 1: Về cơ bản, tôi không thể để có được giá trị cập nhật nếu tôi đã làm

model.set({url: 'new value'}); 

Tiếp theo

model.fetch(); 

'mô hình' là một biến toàn cầu . Tạo ví dụ mới về công việc 'mô hình':

model = new Model({url:'/some/other/url'}); 
    model.fetch(); 

tuy nhiên, hoạt động theo yêu cầu. Điều này có nghĩa là một cá thể mô hình được gắn vĩnh viễn vào một url và nó không thể được đặt lại?

TRẢ LỜI CÂU HỎI CỦA TÔI TRONG CẬP NHẬT 1 Ví dụ mẫu không được đính kèm vĩnh viễn vào url. Nó có thể được thiết lập lại động. Vui lòng đọc kỹ giải thích kỹ lưỡng của @ tkone và sau đó là giải pháp @fguillens để hiểu rõ hơn.

+0

tại sao bạn thay đổi URL? ý tưởng đằng sau một webservice RESTful là đối tượng của bạn luôn luôn có sẵn tại cùng một URL (với một ID khi cần thiết cho một đối tượng cụ thể) – tkone

Trả lời

24

Sau khi đã hiểu @tkone 's giải thích ...

Nếu bạn vẫn muốn có một động Model.url bạn luôn có thể trì hoãn thi công để thời gian chạy, hãy thử này:

window.MyModel = Backbone.Model.extend({ 
    url: function(){ 
    return this.instanceUrl; 
    }, 
    initialize: function(props){ 
    this.instanceUrl = props.url; 
    } 
} 
+4

Bạn có thể làm: 'mm = new MyModel; mm.url = '/ mynewurl /'; 'là tốt. Xương sống là siêu linh hoạt với công cụ này. – tkone

+0

@fguillen - Cảm ơn !! điều này trì hoãn việc xây dựng để chạy thời gian đã làm các trick !! – Vikram

+0

@tkone - cảm ơn một lần nữa! cho tất cả các con trỏ hữu ích của bạn – Vikram

11

Vâng câu trả lời ở đây là bạn muốn làm:

mod.url = '/some/other/url' 

URL được không nằm trong trường hợp của mô hình chính nó, mà đúng hơn là một thuộc tính của đối tượng MyModel rằng bạn đang tạo của bạn ví dụ mẫu từ. Do đó, bạn chỉ cần đặt nó giống như là một thuộc tính đối tượng JavaScript bình thường. set chỉ được sử dụng khi dữ liệu bạn đang thiết lập (hoặc ngược lại nhận được với get) thực sự là thuộc tính của dữ liệu bạn muốn gửi/nhận từ máy chủ.

Nhưng tại sao bạn thay đổi URL là câu hỏi chúng tôi nên hỏi. Ý tưởng đằng sau hệ thống thu thập/mô hình của Backbone là bạn nói với một điểm cuối REST và mỗi mô hình có một điểm cuối tương ứng.

Giống như bạn đã có một blog và blog mà có một "entry" đối tượng trong đó có sẵn tại địa chỉ:

/rest/entry/ 

Và bạn đã có một mô hình Backbone cho Entry:

Entry = Backbone.Model.extend({urlBase: '/rest/entry'}); 

Bây giờ khi bạn save hoặc fetch Xương sống biết cách hoạt động của nó.

Vì vậy, như bạn đang thực hiện một mô hình mới:

e = new Entry(); 
e.set({title: "my blog rulez", body: "this is the best blog evar!!!!1!!"}); 
e.save(); 

này sau đó sẽ làm cho Backbone làm một yêu cầu HTTP POST để /rest/entry với cơ thể:

{ 
    "title": "my blog rulez", 
    "body": "this is the best blog evar!!!!1!!" 
} 

(Khi bạn làm mod.set({url: '/some/other/url'}); của bạn bạn đang thực sự thêm một trường có tên là url vào tập dữ liệu, do đó máy chủ sẽ gửi "url": "/some/other/url" như một phần của nội dung JSON POST ở trên:

{ 
    "title": "my blog rulez", 
    "body": "this is the best blog evar!!!!1!!", 
    "url": "/some/other/url" 
} 

Máy chủ sau đó sẽ phản ứng với một HTTP 200 (hoặc 201) phản ứng với mô hình tương tự, chỉ với, như, nói, và ID kèm theo:

{ 
    "id": 1, 
    "title": "my blog rulez", 
    "body": "this is the best blog evar!!!!1!!" 
} 

Và đó không phải là những gì bạn đang tìm kiếm cho, phải không?)

Bây giờ bạn đã có mô hình này và nó có một ID. Điều này có nghĩa nếu bạn thay đổi nó:

e.set('title', 'my blog is actually just ok'); 
e.save() 

Backbone bây giờ làm cho một yêu cầu HTTP PUT trên /rest/entry/1 để cập nhật các tài nguyên trên máy chủ.

Máy chủ thấy rằng bạn đang nói về ID 1 trên điểm cuối /rest/entry/, vì vậy hãy biết cập nhật bản ghi hiện có (và gửi lại HTTP 200).

TL; DR

Không thay đổi URL, xương sống sẽ. Tạo mô hình mới cho một đoạn dữ liệu mới.

+0

cảm ơn lời giải thích ur! Tôi có một mô hình và url param assoc với điều đó. khi tôi khởi tạo mô hình này, tôi chuyển giá trị url và tìm nạp cuộc gọi() Bây giờ tôi muốn thay đổi giá trị 'url' này khi dữ liệu được tìm nạp vào mô hình này sẽ vẫn có cùng thông số: ví dụ url1:/top; url2:/top/filter1; url3:/top/filter2 .Tôi không chắc chắn nếu nó là thực hành tốt, nhưng tất cả 3 url sẽ trở lại cùng một dữ liệu từ backend, ngoại trừ sẽ có lọc như quy định. Tôi yêu cầu chuyển đổi giữa các url dựa trên 'tab' được nhấp. Tôi có thể có nhiều Mô hình như bạn đã đề cập nhưng tôi đã suy nghĩ liệu tôi có thể tái sử dụng hay không. – Vikram

+0

cho tôi biết suy nghĩ của bạn về số – Vikram

+0

@Vikram để bạn chỉ cố gắng lấy lại một bộ dữ liệu giới hạn được lọc theo thông số bộ lọc của bạn? Tôi khuyên bạn nên tạo bộ sưu tập mới cho từng bộ dữ liệu và thay đổi thuộc tính 'url' của bộ sưu tập. Vì vậy, bạn sẽ có một bộ sưu tập được gọi là 'filter1' thuộc tính URL được đặt thành'/top/filter1', v.v. – tkone

3
model.urlRoot = "/your/url" 

HOẶC

model.urlRoot = function(){ return "/your/url"; } 

OR

model.url = "/your/url" 

HOẶC

model.url = function(){ return "/your/url"; } 

Mặc định 'url' tài sản của một đối tượng Backbone.Model là như dưới đây. Backbone.js doc nói:

URL mặc định cho đại diện của mô hình trên máy chủ - nếu bạn đang sử dụng các phương thức yên tĩnh của Backbone, hãy ghi đè điều này để thay đổi điểm cuối sẽ được gọi.

url: function() { 
    var base = getValue(this, 'urlRoot') || getValue(this.collection, 'url') || urlError(); 
    if (this.isNew()) return base; 
    return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id); 
}, 

Rõ ràng, Nó đầu tiên được giá trị của urlRoot, nếu không có sẵn, nó sẽ nhìn vào url của bộ sưu tập mà mô hình thuộc.Bằng cách xác định urlRoot thay vì url có lợi thế là giảm trở lại url bộ sưu tập trong trường hợp urlRoot là null.

+0

cảm ơn bạn đã dành thời gian trả lời! Tôi đã xem xét một cách để chuyển url trong một mô hình động dựa trên url mà ứng dụng của tôi tạo ra. Câu trả lời tôi đã kiểm tra hoạt động rất tốt đối với tôi. – Vikram

0

Bạn có thể đặt url là tùy chọn trong lấy chức năng, như thế này:

var mod = new MyModel(); 
mod.fetch({ 
    url: '/some/other/url', 
    data: {} 
}); 
Các vấn đề liên quan