4

是一个完整的 Backbone.js 菜鸟问题。我正在处理 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;

});
4

1 回答 1

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

您的 AppView 也没有“渲染”方法,但您在此处引用它:

Jobs.bind('all', this.render, this);
于 2012-06-08T22:06:35.327 回答