2011-10-11 61 views
2

所以我在Backbone有一個收集事件的列表。這個集合有一個方法,它根據傳遞給它的類別列表來過濾列表。如何使用Backbone.js將過濾的集合轉換爲JSON?

var Events = Backbone.Collection.extend({ 
    model: Event, 
    url: settings.events_url, 
    filtered: function(checked) { 
     return this.filter(function(e) { 
      if ($.inArray(e.get('category').name, checked) >= 0) { 
       return true; 
      } else { 
       return false; 
      } 
     }); 
    } 
}); 

我需要做的就是將這個過濾的集合轉換爲JSON,就像你將集合作爲一個整體一樣。

var events = new Events(); 
events.toJSON(); 

然而,由於過濾收集不再是一個實際的集合,而是模型列表,我沒有提供給我的.toJSON()方法。有沒有辦法將我過濾的集合轉換爲真正的集合?或者有更簡單的方法將其轉換爲JSON?

謝謝!

回答

3

constructor for a collection可以採取的機型列表作爲參數,從而:

var events = new Events(); 
var filteredEvents = new Events(events.filtered(true)); 
console.log(filteredEvents.toJSON()); 
+0

這工作很好。謝謝! –

+0

很高興我能幫到你。 –

0

你可以像這樣:

var myFilteredCollection = new Events(); 

_.each(myFilteredData, function(eventModel){ 
    myFilteredCollection.add(eventModel); 
}); 

myFilteredCollection.toJSON(); 
2

爲什麼不使用標準的API的?

var checked = ['foo', 'bar', 'baz'], 
    filtered = eventsCollection 
     .chain() 
     .filter(function(model) { 
      return _.include(checked, model.get('category').name); 
     }) 
     .invoke('toJSON') 
     .value(); 

單獨注意,Events.filterByCategoryName方法名稱更加明確。但是,我傾向於不在設計中實現太多'方便'的方法,並直接使用它們來接受標準API。

+0

爲解決方案的榮譽 – Alberto

1

您也可以嘗試這樣的:

filtered: function(checked) { 
     return _.map(this.filter(function(e) { 
      return $.inArray(e.get('category').name, checked) >= 0 
     }), function(model) { 
      return model.toJSON(); 
     }); 
    } 

從裏面開始了:

  1. 到this.filter將返回過濾的結果的列表,你有它已經呼叫。
  2. _.map將對其傳遞的數組的每個條目執行一個操作(它只是返回model.toJSON()的結果)。
0

我解決它的方法是在集合上運行reduce函數。這樣做的好處是,您只需對集合本身進行1次傳遞,只記住有效的模型,並在通過驗證時返回模型的JSON。

提供其他解決方案來構建一個性能明智的新集合 - 可怕的。

getValidItems: function() { 
     //return only valid items as json 
     return this.collection.reduce(function (validItems, row) { 
      if (row.isValid()) { 
       validItems.push(row.toJSON()); 
      } 
      return validItems; 
     }, []); 
    }, 


    //somewhere where you save 
    save: function() { 
     var validItems = this.getValidItems(); 
     //do something with valid items 
    } 
相關問題