如何过滤Backbone.js集合和Rerender App View?

Jer*_* H. 4 javascript mongoose mongodb singlepage backbone.js

是一个完整的Backbone.js noob问题.我正在尝试构建一个相当简单的单个应用程序界面的ToDo Backbone.js示例.虽然todo项目更多地是关于用户输入,但这个应用程序更多的是基于用户选项(点击事件)过滤数据.

我是Backbone.js和Mongoose的新手,并且无法找到我想要做的好例子.我已经能够让我的api从MongoDB集合中提取数据并将其放入Backbone.js集合中,该集合在应用程序中呈现它.我不能为我的生活弄清楚如何做的是过滤该数据并重新渲染应用程序视图.我试图通过文档中的"类型"字段进行筛选.

这是我的脚本:

(我完全知道需要进行一些重大的重构,我只是快速地对一个概念进行原型设计.)

$(function() {

    window.Job = Backbone.Model.extend({
        idAttribute: "_id",

        defaults: function() {
            return {
                attachments: false
            }
        }
    });

    window.JobsList = Backbone.Collection.extend({
        model: Job,
        url: '/api/jobs',
        leads: function() {
            return this.filter(function(job){ return job.get('type') == "Lead"; });
        }
    });

    window.Jobs = new JobsList;

    window.JobView = Backbone.View.extend({
        tagName: "div",
        className: "item",
        template: _.template($('#item-template').html()),
        initialize: function() {
            this.model.bind('change', this.render, this);
            this.model.bind('destroy', this.remove, this);
        },
        render: function() {
            $(this.el).html(this.template(this.model.toJSON()));
            this.setText();
            return this;
        },
        setText: function() {
            var month=new Array();
            month[0]="Jan";
            month[1]="Feb";
            month[2]="Mar";
            month[3]="Apr";
            month[4]="May";
            month[5]="Jun";
            month[6]="Jul";
            month[7]="Aug";
            month[8]="Sep";
            month[9]="Oct";
            month[10]="Nov";
            month[11]="Dec";

            var title = this.model.get('title');
            var description = this.model.get('description');
            var datemonth = this.model.get('datem');
            var dateday = this.model.get('dated');
            var jobtype = this.model.get('type');
            var jobstatus = this.model.get('status');
            var amount = this.model.get('amount');
            var paymentstatus = this.model.get('paymentstatus')

            var type = this.$('.status .jobtype');
            var status = this.$('.status .jobstatus');

            this.$('.title a').text(title);
            this.$('.description').text(description);
            this.$('.date .month').text(month[datemonth]);
            this.$('.date .day').text(dateday);
            type.text(jobtype);
            status.text(jobstatus);

            if(amount > 0)
                this.$('.paymentamount').text(amount)

            if(paymentstatus)
                this.$('.paymentstatus').text(paymentstatus)

            if(jobstatus === 'New') {
                status.addClass('new');
            } else if (jobstatus === 'Past Due') {
                status.addClass('pastdue')
            };

            if(jobtype === 'Lead') {
                type.addClass('lead');
            } else if (jobtype === '') {
                type.addClass('');
            };
        },
        remove: function() {
            $(this.el).remove();
        },
        clear: function() {
            this.model.destroy();
        }
    });

    window.AppView = Backbone.View.extend({
        el: $("#main"),
        events: {
            "click #leads .highlight" : "filterLeads"
        },
        initialize: function() {
            Jobs.bind('add', this.addOne, this);
            Jobs.bind('reset', this.addAll, this);
            Jobs.bind('all', this.render, this);

            Jobs.fetch();
        },
        addOne: function(job) {
            var view = new JobView({model: job});
            this.$("#activitystream").append(view.render().el);
        },
        addAll: function() {
            Jobs.each(this.addOne);
        },
        filterLeads: function() {
            // left here, this event fires but i need to figure out how to filter the activity list.
        }
    });

    window.App = new AppView;

});
Run Code Online (Sandbox Code Playgroud)

Rya*_*ell 5

您是否尝试使用"潜在客户"过滤器的结果重置集合?

就像是

window.AppView = Backbone.View.extend({
    el: $("#main"),
    events: {
        "click #leads .highlight" : "filterLeads"
    },
    initialize: function() {
        Jobs.bind('add', this.addOne, this);
        Jobs.bind('reset', this.render, this); //render on reset

        Jobs.fetch(); //this triggers reset
    },
    addOne: function(job) {
        var view = new JobView({model: job});
        this.$("#activitystream").append(view.render().el);
    },
    //add a render function
    render: function() {
        this.$("#activitystream").empty(); //empty out anything thats in there

        Jobs.each(this.addOne);
    },
    filterLeads: function() {
        Jobs.reset(Jobs.leads()); //reset Jobs with only the leads
    }
});
Run Code Online (Sandbox Code Playgroud)

你的AppView也没有"渲染"方法,但你在这里引用它:

Jobs.bind('all', this.render, this);
Run Code Online (Sandbox Code Playgroud)