2012-04-18 31 views
27

Khi bạn ghi đè đồng bộ xương sống, cả hai model/collection .save()/fetch() đều sử dụng cùng một phương thức đồng bộ xương sống, vậy cách tốt nhất để kiểm tra là gì những gì Backbone.sync nhận được là một mô hình hoặc một bộ sưu tập các mô hình?Kiểm tra xem một cái gì đó là một mô hình hoặc bộ sưu tập trong xương sống js

Như một ví dụ:

Backbone.sync = function(method, model, options){ 
    //Model here can be both a collection or a single model so 
if(model.isModel()) // there is no isModel or isCollection method 
} 

Tôi cho rằng tôi đang tìm kiếm một thực hành tốt nhất "an toàn", tôi có thể về kiểm tra khóa học cho thuộc tính hoặc các phương pháp mà chỉ có một mô hình hay một bộ sưu tập có nhất định, nhưng có vẻ như hackish, không nên có một cách rõ ràng hơn? Và có lẽ tôi không thể tìm thấy nó.

Cảm ơn!

Trả lời

56

Bạn cũng có thể thử instanceof như vậy:

Backbone.sync = function(method, model, options) { 
    if (model instanceof Backbone.Model) { 
    ... 
    } else if (model instanceof Backbone.Collection) { 
    ... 
    } 
} 
2

Điều này cũng không kém phần quan trọng, nhưng bộ sưu tập Backbone có thuộc tính mô hình và mô hình không - đó chính là mô hình.

Có lẽ phương thức an toàn hơn là model.toJSON() và xem kết quả là một đối tượng hay một mảng. Bạn có thể sẽ model.toJSON() trong Backbone.sync tùy chỉnh của bạn anyway, do đó, mặc dù điều này là khá tốn kém tính toán, nó sẽ xảy ra anyway.

+0

Upvote bởi vì tôi đã kiểm tra trên thuộc tính 'length' (chỉ Bộ sưu tập ...?!?) ngày hôm qua trong một số mã hóa nhanh chóng! Kiểm tra trên 'mô hình' là tuyệt vời trong so sánh. Haha. – eightyfive

+3

Các bạn không nên trông cậy vào những thứ như thế này vì chúng có thể thay đổi trong tương lai và phá vỡ mã của bạn. Sử dụng từ khóa instanceof như mô tả :) –

0

Bạn có thể làm điều gì đó như thế này.

Backbone.Model.prototype.getType = function() { 
    return "Model"; 
} 

Backbone.Collection.prototype.getType = function() { 
    return "Collection"; 
} 

if(model.getType() == "Model") {} 
if(model.getType() == "Collection"){} 
+4

Đó là một ý tưởng rất tồi, hầu như không thể duy trì khi ứng dụng trở nên phức tạp hơn. Và điều gì sẽ xảy ra nếu một đối tượng cần một phương thức getType() nói về một loại xe thay vì một loại đối tượng xương sống? –

+0

@NicolasZozol không đồng ý. Tôi không thấy làm thế nào điều này là khó khăn để duy trì và điểm thứ 2 chỉ đơn giản là không công bằng. Bạn có thể gọi các phương pháp trên bất cứ điều gì bạn muốn. Ví dụ 'getBackboneObjectType', chắc chắn sẽ không gây ra bất kỳ xung đột đặt tên nào. –

+0

Lý do tại sao điều này là xấu, nó đòi hỏi người thực hiện phải theo dõi các loại đối tượng chứa trong thư viện của bên thứ ba và tạo một mẫu thử getType mới mỗi khi một kiểu mới được đưa vào các phiên bản tương lai của Backbone. Thêm vào đó, bạn tự đánh vần lỗi chính tả các loại không có cách dễ dàng để phát hiện nó (vì tất cả đều được thực hiện thông qua so sánh chuỗi.) Sử dụng instanceof cho phép các trình biên dịch JavaScript (như node.js) phát hiện bất kỳ lỗi chính tả nào, và sẽ biên dịch không thành công tên thay đổi trong phiên bản cập nhật của xương sống, làm cho các thay đổi đột phá dễ dàng hơn để xác định. –

10

@ câu trả lời fiskers7 của làm việc với phần mở rộng sâu:

 var Item = Backbone.Model.extend({ 
      className : 'Item', 
      size :10 
     }); 

     var VerySmallItem = Item.extend({ 
      size :0.1 
     }); 

     var item = new Item(); 
     var verySmall = new VerySmallItem(); 

     alert("item is Model ?" + (item instanceof Backbone.Model)); //true 
     alert("verySmall is Model ?" + (verySmall instanceof Backbone.Model)); //true 
0

Tôi không hoàn toàn chắc chắn làm thế nào tôi cảm thấy về vấn đề này bởi vì nó có vẻ hơi khó hiểu, nhưng tôi không thể nghĩ chính xác tại sao nó sẽ trở thành siêu tệ vào lúc này.

Chắc chắn đơn giản, và nhanh hơn so với một "instanceof" kiểm tra (tôi giả sử bạn sẽ không nêu tên bất kỳ chức năng khác "isBBModel/Bộ sưu tập" trên các đối tượng của bạn?)

Backbone.Model.prototype.isBBCollection = function() { return false; } 
Backbone.Model.prototype.isBBModel = function() { return true; } 
Backbone.Collection.prototype.isBBCollection = function() { return true; } 
Backbone.Collection.prototype.isBBModel = function() { return false; } 
Các vấn đề liên quan