2012-07-16 10 views
10

Tôi đang cố gắng sử dụng phương pháp 'Tìm' trên bộ sưu tập nhưng không cho tôi kết quả như mong đợi:Sử dụng dấu gạch dưới Phương pháp 'tìm' trên Bộ sưu tập xương sống

Tôi có mô hình cơ sở không có mặc định và bộ sưu tập mặc định. Các mô hình trong bộ sưu tập của tôi chỉ có hai thuộc tính: tranId (một guid là một chuỗi), và thực hiện (một hàm để thực hiện).

Tôi đang cố gắng để tìm mục trong bộ sưu tập phù hợp với tranId mà tôi vượt qua nó ...

var tranId = "1a2b3c"; 

    var found = _.find(myCollection, function(item){ 
     return item.tranId === tranId; 
    }); 

Tìm thấy luôn là undefined, mặc dù chương trình gỡ rối cho thấy bộ sưu tập của tôi không, thực sự có một mục trong đó tranId khớp với biến của tôi. Tôi không thể thiết lập một điểm ngắt tại câu lệnh return để xem item.tranId nào tương đương với. Tôi cũng đã thử điều này ...

var found = _.find(myCollection, function(item){ 
     return item.get('tranId') === tranId; 
    }); 

Nhưng, điều tương tự. 'tìm thấy' luôn không xác định. Tôi làm gì sai ở đây?

Trả lời

20

bộ sưu tập Backbone thực hiện many of the Underscore functions, vì vậy bạn có thể làm điều này:

var found = myCollection.find(function(item){ 
     return Number(item.get('tranId')) === tranId; 
}); 

Ngoài ra để gỡ lỗi nếu các giá trị không phải là những gì bạn mong đợi thử:

var found = myCollection.find(function(item){ 
     console.log('Checking values', item, item.get('tranId'), tranId); 
     return Number(item.get('tranId')) === tranId; 
}); 
+0

Cảm ơn, điều đó đã hiệu quả. Tại sao phương pháp Underscore không hoạt động theo cùng một cách? Cũng cần lưu ý rằng tranId là một chuỗi, không phải là một số. Vì vậy, các typecasting là không cần thiết. –

+2

@ JoelCDoyle nếu bạn muốn sử dụng phương pháp gạch dưới trực tiếp có thể tốt hơn là sử dụng myCollection.models vì nó là Array thô của các mô hình của bạn http://backbonejs.org/#Collection-models - typecast trong trường hợp có vấn đề với so sánh datatyping nghiêm ngặt. : D –

+0

Tuyệt. Cảm ơn bạn rất nhiều! –

5

Một bộ sưu tập không có nghĩa là hoàn toàn giống nhau điều trong Backbone (một đối tượng quản lý một danh sách các mô hình) và Underscore (một danh sách các đối tượng). Những gì bạn cần phải vượt qua để _.findmyCollection.models

_.find(myCollection.models, function(model) { 
    return model.get('tranId')===tranId; 
}); 

Như @Daniel Aranda giải thích, Backbone proxy Underscore methods on collections và bạn có thể viết ví dụ của bạn như

myCollection.find(function(model) { 
    return model.get('tranId')===tranId; 
}); 

Cuối cùng, nếu tranId là ID mô hình của bạn, bạn có thể set id as the idAttribute và đơn giản hóa toàn bộ điều này bằng cách sử dụng get

var M=Backbone.Model.extend({ 
    idAttribute: "tranId" 
}); 
var C=Backbone.Collection.extend({ 
    model:M 
}); 

var myCollection=new C([ 
    {tranId:'not this one'} , 
    {tranId:'another'} , 
    {tranId:'1a2b3c'} 
]); 

myCollection.get(tranId); 

Và một Fiddle http://jsfiddle.net/rYPLU/

+0

Tuyệt vời. Cảm ơn bạn! –

+0

Rất hữu ích, cảm ơn! Cũng giống như một nhận xét bên ngoài, hãy nhớ rằng 'idAttribute' mặc định của mô hình Backbone là trường' id', [đọc doc] (http://backbonejs.org/#Model-idAttribute) để biết thêm thông tin – enricostn

10

Một đơn giản hơn một:

var found = myCollection.findWhere({'tranId': tranId}) 

Xem here để biết chi tiết.

Nếu bạn phải sử dụng phương pháp nhấn mạnh:

var found = _.find(myCollection.models, function(item){ 
    return item.get('tranId') === tranId; 
}); 

Vì myCollection.models là một mảng, myCollection không.

Tôi thích cái cũ hơn.

+0

Rất đẹp . Tôi thích giải pháp một dòng! –