2013-07-07 637 views
19

Tôi có một mô hình có thể được chỉnh sửa bởi một chế độ xem nhất định; tuy nhiên, ở cuối chế độ xem, người dùng sẽ có tùy chọn lưu hoặc hủy tất cả thay đổi. Điều này có nghĩa là bạn sẽ cần phải lưu trữ một danh sách tất cả các thay đổi được thực hiện cho mô hình và sau đó thực hiện những thay đổi đó chỉ khi nút 'lưu' đã được nhấp. Điều này nghe có vẻ phức tạp không cần thiết và tôi đã đưa ra một ý tưởng về một cách tiếp cận thay thế, đó là tạo ra một bản sao của mô hình và thực hiện các thay đổi đó trong khung nhìn. Sau đó, nếu người dùng nhấp vào 'lưu' xóa mô hình cũ và thay thế nó trong bộ sưu tập của nó bằng mô hình mới, nếu không bạn sẽ loại bỏ mô hình nhân bản.Làm thế nào để nhân bản các mô hình trong Backbone

Đây là cách tiếp cận có thể chấp nhận được và nếu có, làm cách nào tôi có thể triển khai quy trình nhân bản?

Điều này tương đương với việc tìm nạp lại dữ liệu từ máy chủ (nhưng yêu cầu HTTP phụ có vẻ không cần thiết).

+1

Nhưng tại sao bạn cần sao chép mô hình? Dù sao bạn có thể trích xuất tất cả các giá trị trên Save nhấp chuột và lưu chúng; hoặc nếu bạn muốn biết nếu có bất kỳ giá trị nào được thay đổi trong khi lưu, chỉ cần thực hiện 'Ràng buộc xem mô hình '.. – Pawan

Trả lời

25

Bạn có thể sử dụng phương thức clone. Chẳng hạn ngắn dưới đây:

var Model = Backbone.Model.extend({}); 
var View = Backbone.View.extend({ 
    initialize: function() { 
     this.realModel = this.model; 
     this.model = this.realModel.clone(); 
    }, 
    onSave: function() { 
     this.realModel.set(this.model.attributes); 
    } 
}); 

Bạn cũng có thể làm điều gì đó một chút khác nhau:

var Model = Backbone.Model.extend({}); 
var View = Backbone.View.extend({ 
    initialize: function() { 
     // save the attributes up front, removing references 
     this._modelAttributes = _.extend({}, this.model.attributes); 
    }, 
    onSave: function() { 
     // revert to initial state. 
     this.model.set(this._modelAttributes); 
    } 
}); 
+0

là' this.realModel.set (this.model.attributes); 'chắc chắn là an toàn? Tôi chỉ nghĩ rằng giá trị 'this' có thể khác (mặc dù tôi nghĩ 'this' đề cập đến' Backbone.Model' trong cả hai, tôi không chắc chắn) –

+0

Ngoài ra, xin lỗi vì sự thiếu hiểu biết của tôi, nhưng điểm của dòng 'var Model = Backbone.Model.extend ({});' - Tôi không thấy bạn sử dụng 'Model' ở bất kỳ đâu. Hoặc là bạn chỉ cần làm một ví dụ và gợi ý rằng bạn chuyển 'Mô hình' vào làm mô hình cho chế độ xem khi bạn tạo một cá thể của nó? –

+0

Tôi đã lên kế hoạch khởi tạo chế độ xem với một mô hình, nhưng tôi thì không. Bạn có thể bỏ qua 'var Model'. 'This' này là' this.realModel.set (this.model.attributes) 'này luôn đề cập đến khung nhìn vì đó là ngữ cảnh hiện tại. – kalley

0

Bạn có thể cung cấp cho Backbone.Memento một thử.

Nếu bạn không muốn sử dụng nó không thành vấn đề. Tuy nhiên, bạn có thể có được một ý tưởng tốt về cách nó nên được thực hiện từ codebase.

+0

có lý do nào để sử dụng phương pháp này trên phương pháp của kalley ở trên hay bạn chỉ đang cung cấp giải pháp thay thế? –

+0

Không, đó là một giải pháp thay thế. Nó rất nhỏ và cung cấp nhiều tính năng khác. Đó là lý do tại sao tôi đề nghị. – Rifat

0

Tôi thường giải quyết vấn đề này với bộ nhớ cache đối tượng trên chế độ xem. Bằng cách đó tôi không thêm bất kỳ chi phí không cần thiết nào để quản lý mô hình/xem. Việc hủy bỏ diễn ra tự nhiên nếu người dùng đóng chế độ xem mà không lưu.

var Model = Backbone.Model.extend({ 
    'title': 'Hello' 
}); 

var View = Backbone.View.extend({ 
    initialize: function() { 

     // Holds temporary values until save 
     this.cache = {}; 

    }, 
    onTitle: function() { 
     this.cache.title = 'World'; 
    }, 
    onSave: function() { 
     this.model.set(this.cache); 
    } 
});