2012-07-16 155 views
10

我想對集合使用下劃線方法「發現」,但它不給我我希望的結果用下劃線法「查找」:中的骨幹收集

我有沒有一個基本模型默認和默認集合。我集合中的模型只有兩個屬性:tranId(guid作爲字符串)和perform(執行的函數)。

我試圖找到我傳遞給它tranId匹配的集合中的項目...

var tranId = "1a2b3c"; 

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

發現總是不確定的,即使調試器顯示我的收藏呢,確實有tranId與我的變量相匹配的項目。我無法在return語句中設置斷點來查看item.tranId等同於什麼。我也試過這個...

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

但是,同樣的事情。 '找到'總是未定義的。我在這裏做錯了什麼?

回答

20

骨幹集合實現many of the Underscore functions,所以你可以這樣做:

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

而且調試如果值是不是您所期望嘗試什麼:

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

謝謝,這工作。爲什麼Underscore方法不以相同的方式工作?還應該注意的是,tranId是一個字符串,而不是一個數字。所以,類型轉換不是必需的。 – 2012-07-16 15:05:20

+2

@JoelCDoyle如果你想直接使用下劃線方法可能會更好地使用myCollection.models,因爲它是原始數據你的模型http://backbonejs.org/#Collection-models - 類型轉換是爲了防止嚴格的數據分析比較的問題。 :D – 2012-07-16 15:32:07

+0

很酷。非常感謝! – 2012-07-16 20:15:32

5

集合並不意味着完全一樣Backbone(一個管理模型列表的對象)和Underscore(對象列表)中的東西。你應該傳遞給_.findmyCollection.models

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

由於@Daniel阿蘭達解釋,骨幹代理Underscore methods on collections,你可以寫你的例子作爲

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

最後,如果tranId爲型號ID,你可以set id as the idAttribute並通過使用簡化整個事物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); 

和小提琴http://jsfiddle.net/rYPLU/

+0

非常好。謝謝! – 2012-07-16 20:21:23

+0

非常有用,謝謝! 正如旁邊的評論記住,Backbone模型的默認'idAttribute'是'id'字段,[閱讀文檔](http://backbonejs.org/#Model-idAttribute)瞭解更多信息 – enricostn 2014-09-21 12:41:56

10

一個更簡單的一個:

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

詳見here

如果必須使用下劃線方法:

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

因爲myCollection.models是一個數組,MyCollection的不是。

我更喜歡前者。

+0

非常好。我喜歡單線解決方案! – 2014-08-05 20:09:40