2014-06-18 81 views
0

Im對渲染函數有問題。該函數將數組作爲參數並返回集合的新模型。但它只渲染一次。我點擊運行它,集合本身聽取「更改」。問題是收集沒有得到新的項目。骨幹。渲染/重置已過濾的集合

我認爲它的復位功能就是問題所在。但我不知道如何以另一種方式做到這一點。基本上我只是想刪除所有以前的模型,並設置新的。我會怎麼做?

謝謝!

filter: function(f) { 

    var filter = this.collection.filter(function(o){ 
     var accept = false;          
     $(f).each(function(i,val){ 
      if(_.indexOf(o.get('tags'), val) >-1){ 
       accept = true;      
      } 
     }) 
     return accept; 
    }); 

    this.collection.reset(filter); 

    new PeopleView({ 
     el: this.$('.list'), 
     collection: this.collection 
    }); 

}, 

PeopleView渲染:

PeopleView = Backbone.View.extend({ 

initialize: function() { 
    this.render(); 
}, 

render: function() { 
    this.$el.html(''); 
    this.collection.each(this.renderPerson, this); 
    this.listenTo(this.collection,'change',this.render); 
}, 

renderPerson: function (person) { 
    this.$el.append(new PersonView({ 
     tagName: 'li', 
     id:'p_'+person.get('id'), 
     model: person 
    }).el); 
}, 

});

+0

我也試圖用「設置「而不是」重置「。也不起作用。 this.collection.set(過濾器); – user3122094

+0

我沒有看到這裏定義的'render'方法。 – Mathletics

+0

對不起,如果不清楚。但是「Peopleview」呈現自己。只需將該集合作爲參數/選項。 – user3122094

回答

0

我做的這對代碼筆簡單的版本,並得到它的工作(沒有視圖和過濾器的標準是硬編碼),但原則似乎相同

的主要區別是,它偵聽「復位」在我的收藏中看到,因爲這是你要求收藏做的事情。 You can see it here,只要有您的控制檯打開看到的結果

var PeopleModel = Backbone.Model.extend({ 
}); 
var PeopleCollection = Backbone.Collection.extend({ 
    model: PeopleModel 
}); 

var peopleCollection = new PeopleCollection([{ 
    id: 1, 
    name: "jim" 
}, { 
    id: 2, 
    name: "fred" 
}]); 

//listen for restet 
peopleCollection.on("reset", function() { 
    console.log("people reset"); 
    console.log(peopleCollection.models); 
}); 

var filter = peopleCollection.filter(function(o) { 
    var accept = false; 
    $(['i']).each(function(i, val) { 
     if (_.indexOf(o.get('name'), val) > -1) { 
      accept = true; 
     } 
    }); 
    return accept; 
}); 
console.log("people:",peopleCollection);//this will print that the collection has two models 
peopleCollection.reset(filter); //now i have rest with the filter the log will show only one model