Javascript 脊梁骨渲染/重置筛选的集合
我的渲染功能有问题。函数以数组作为参数,返回集合的新模型。但它只渲染一次。我只需点击一下就可以运行它,而收藏本身就会听到“更改”。问题是集合无法获取新项 我认为问题出在重置功能上。但我不知道如何用另一种方式来做。基本上,我只想删除所有以前的模型,并设置新的。我该怎么做 谢谢Javascript 脊梁骨渲染/重置筛选的集合,javascript,backbone.js,Javascript,Backbone.js,我的渲染功能有问题。函数以数组作为参数,返回集合的新模型。但它只渲染一次。我只需点击一下就可以运行它,而收藏本身就会听到“更改”。问题是集合无法获取新项 我认为问题出在重置功能上。但我不知道如何用另一种方式来做。基本上,我只想删除所有以前的模型,并设置新的。我该怎么做 谢谢 filter: function(f) { var filter = this.collection.filter(function(o){ var accept = false;
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);
},
})) 我在代码笔上制作了一个更简单的版本,并使其工作(没有视图和过滤器标准是硬编码的),但原理似乎是一样的 主要区别在于,它侦听我的集合上的“重置”事件,因为这是您要求集合执行的操作,只需打开控制台即可查看结果
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
若要从集合中删除模型集,请尝试下面的简单解决方案
我还尝试使用“设置”而不是“重置”。也不行。this.collection.set(过滤器);我看不到这里定义的
渲染
方法。如果不清楚,很抱歉。但是“Peopleview”呈现了它自己。只需将集合作为参数/选项输入即可。PeopleView
的代码在哪里<默认情况下,code>render是一个noop
。有几个问题:在new PersonView()之后,您没有调用render()
。在您的reset()
问题上:您需要收听reset
或add
事件,change
在属性更改时触发,而不是在添加/重置时触发。我觉得你的filter()
方法很可怕<代码>$(f).each()
:什么是f
?我的建议:我不会重置你刚刚用找到的模型进行筛选的集合。它可能会工作,但有一种主从式收集(从主到从过滤)将是一件更好的事情。
that.collection.remove(filter);