2011-12-11 47 views
9

Điều gì sẽ là cách tốt nhất để đảm bảo rằng bộ sưu tập của tôi vẫn được lưu trong bộ nhớ cache và do đó chỉ được tìm nạp một lần?Bộ sưu tập lưu trong bộ nhớ đệm trong backbone.js?

Tôi có nên triển khai một số loại lớp bộ nhớ cache không? Tôi có nên chia sẻ biến số Collection đến bất kỳ nơi nào cần thiết không? Tôi có thể tin tưởng cài đặt jQuerys AJAX không? ($.ajaxSetup ({ cache: true });)

Bộ sưu tập cơ bản như có vẻ ngay bây giờ:

theCollection = Backbone.Collection.extend({ 
    model: theModel, 
    url: "source.json" 
}); 

if (typeof myCollection === 'undefined') { 
    var myCollection = new theCollection; // Only allow it to be created once 
} 
+0

Tiền thưởng đang BẬT! Tìm cách để có thêm một số ý kiến ​​về chủ đề này! – Industrial

+0

Bạn có muốn giữ bộ sưu tập của mình được lưu trữ trên trình duyệt bằng cách sử dụng localStorage hay chỉ đảm bảo rằng bộ sưu tập là một singleton và luôn luôn bạn cần nó sẽ gọi cùng một cá thể đã được tìm nạp? –

Trả lời

16

tôi sẽ thực hiện một loại quản lý bộ sưu tập trong trường hợp của bạn:

var manager = (function(){ 

    var constructors = { 
    'example': ExampleCollection 
    }; 
    var collections = {}; 

    return { 
    getCollection: function(name) { 
     if(!collections[name]) { 
     var collection = new constructors[name](); 
     collection.fetch(); 
     collections[name] = collection; 
     } 
     return collections[name]; 
    } 
    } 
})(); 

Ở đây người quản lý có trách nhiệm instantiating bộ sưu tập và lấy chúng. Khi bạn gọi:

var exampleCollection = manager.getCollection('example'); 

bạn nhận được một ví dụ về bộ sưu tập mẫu với dữ liệu đã được tìm nạp. Bất cứ khi nào bạn cần bộ sưu tập này một lần nữa, bạn có thể gọi lại phương thức. Sau đó, bạn sẽ nhận được chính xác cùng một trường hợp mà không cần phải lấy lại nó.

Đây chỉ là một ví dụ về trình quản lý rất đơn giản và có rất nhiều tính năng bổ sung mà bạn có thể triển khai và nâng cao.

Tôi đặc biệt khuyên không nên xử lý vấn đề này ở mức thấp hơn (ví dụ: lớp vận chuyển của $ .ajax). Nếu bạn làm điều đó, bạn sẽ ngăn không cho bộ sưu tập của bạn bị tìm nạp nhiều lần, nhưng bạn sẽ có các phiên bản mẫu khác nhau với cùng một id nổi xung quanh ứng dụng của bạn. Mỗi cá thể bộ sưu tập sẽ tạo ra các mô hình riêng của nó.

Trong ứng dụng CouchApp hiện đang làm việc, tôi cũng thấy cần thiết để ngăn các bản sao mô hình trùng lặp trong các bộ sưu tập khác nhau (các khung nhìn db khác nhau có thể trả về cùng một dữ liệu mô hình). Điều này đã được giải quyết bằng cách có một bộ sưu tập riêng trong trình quản lý, theo dõi tất cả các mô hình đã được tải vào ứng dụng.

Cuối cùng nhưng không kém phần quan trọng bạn có thể xem xét triển khai phương thức làm mới trong bộ sưu tập của mình hoặc người quản lý sẽ xử lý việc cập nhật bộ sưu tập từ máy chủ. Nếu bạn làm điều này với phương pháp lấy toàn bộ bộ sưu tập của bạn được reseted để tất cả các mô hình bị phá hủy và sau đó tái tạo. Điều này là xấu nếu bạn có các mô hình từ bộ sưu tập này được tham chiếu ở một nơi khác trong ứng dụng (như bạn thường làm). Những trường hợp đó đã lỗi thời và được sao chép trong ứng dụng của bạn sau đó. Phương thức làm mới kiểm tra các trường hợp với các id đến đã có trong bộ sưu tập curent. Nếu vậy chúng được cập nhật, nếu không chúng sẽ được thêm vào.

0

Bạn có thể cố gắng tiết kiệm bộ sưu tập của bạn trong localStorage. Đây là liên kết (http://documentcloud.github.com/backbone/#examples-todos).

Ứng dụng sử dụng bộ điều hợp LocalStorage để minh bạch lưu tất cả các todos trong trình duyệt của bạn, thay vì gửi chúng đến máy chủ.

Tôi hy vọng nó sẽ giúp :)

2

Nếu bằng cách lưu vào bộ nhớ đệm, bạn có thể tham khảo cùng một danh sách tên miền từ nhiều vị trí trong ứng dụng JS mô-đun, chúng tôi sử dụng RequireJS cho việc này. Bạn có thể tách bộ sưu tập của mình thành một mô-đun trong ứng dụng, sau đó bạn yêu cầu bất cứ nơi nào bạn đang sử dụng nó.Trong giả:

require(["myCollection"], 
    function(myCollection) { 
     var MyView = Backbone.View.extend(); 
     new MyView({ 
      collection: myCollection 
     }).render(); 
    } 
); 

hàm callback của bạn sẽ luôn luôn nhận được cùng một ví dụ bạn quay trở lại khi bạn xác định myCollection mô-đun của bạn. Liên kết với cá thể đó từ tất cả các chế độ xem của bạn và bất cứ khi nào nó được làm mới, các lượt xem đó sẽ nhận được trình kích hoạt sự kiện và có thể tự cập nhật.

+0

Điều này sẽ không làm mới? Giả sử mô-đun bộ sưu tập của bạn được định nghĩa là 'return Backbone.Collection.extend ({mô hình: myCollection, url: app.baseUrl() + 'myCollection'});' Làm cách nào bạn có được một lần tìm nạp khác? – seebiscuit

+0

Phụ thuộc vào nơi bạn đang gọi _.fetch() _. Trong thực tế, trong trường hợp này, bạn thực sự muốn trả về một cá thể từ hàm factory module của bộ sưu tập của bạn, và sau đó cá thể đó sẽ được chia sẻ trên các khung nhìn khác nhau. –

0

Một giải pháp đơn giản là tạo biến toàn cầu cho bộ sưu tập của bạn để tất cả mã javascript của bạn sẽ sử dụng cùng một biến.

Chỉ cần lấy bộ sưu tập khi tải trang

$(function() { 
    myCollection = theCollection(); 
    myCollection.fetch(); 
}); 

Kể từ var không được sử dụng để tuyên bố myCollection, sau đó nó trở thành một biến toàn cầu.

Tất nhiên đây là triển khai đơn giản. Có nhiều triển khai mạnh mẽ hơn nhưng tùy thuộc vào nhu cầu của bạn, chúng có thể quá mức cần thiết.

0

Tôi đã kết thúc một số việc tương tự như giải pháp của ProTom. Thay vì tự động khởi tạo một bộ sưu tập dựa trên tên, tôi quyết định chỉ sử dụng một hàm để thiết lập bộ sưu tập. Thông qua ứng dụng của tôi, tôi cần phải khởi tạo các bộ sưu tập khác nhau tùy thuộc vào nơi nó đến từ đâu. Điều này được chứng minh là cách tốt nhất cho nhu cầu của tôi. Đây là CoffeeScript:

Cache:

cachedCollections: {} 
getCollection: (key, block) -> 
    collection = @cachedCollections[key] 
    return collection if collection 
    collection = block() 
    @cachedCollections[key] = collection 
    collection 

Cách sử dụng:

commentCollection = getCollection "comments-#{postId}", -> 
    collection = new CommentCollection 
    collection.url = "/api/posts/#{postId}/comments" 
    collection 
Các vấn đề liên quan