Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 脊梁骨渲染/重置筛选的集合_Javascript_Backbone.js - Fatal编程技术网

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);