Javascript 主干js过滤器显示

Javascript 主干js过滤器显示,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,我有一个带有过滤器的项目集合。过滤器是基于几个复选框应用的。如果用户选择不同的月份(项目被刷新),则项目集合将更改 我的方法是在每个项目上循环,然后如果项目是匹配显示项目,则对该项目应用过滤器。此方法在加载期间的当前月份有效,但当选择另一个月时,将执行循环,如果条件评估为false,则仍将执行该条件。我知道条件为false,因为当我在条件上放置断点时,我能够在控制台中看到该语句的计算结果为false。即使为false,下一步也会进入条件 这是代码 render: function() {

我有一个带有过滤器的项目集合。过滤器是基于几个复选框应用的。如果用户选择不同的月份(项目被刷新),则项目集合将更改

我的方法是在每个项目上循环,然后如果项目是匹配显示项目,则对该项目应用过滤器。此方法在加载期间的当前月份有效,但当选择另一个月时,将执行循环,如果条件评估为false,则仍将执行该条件。我知道条件为false,因为当我在条件上放置断点时,我能够在控制台中看到该语句的计算结果为false。即使为false,下一步也会进入条件

这是代码

render: function() {
                display = this.model.get('display');
                filters = this.model.get('filters');


                //Check each class for filter parameters
                items.forEach(function (cla) {

                    //reset all items
                    $("#" + cla.id).parent().removeClass('matches');
                    $("#" + cla.id).parent().removeClass('noMatches');


                    //Get all filters
                    var hasCredit = "credits";
                    var hasLocation = "location";
                    var hasStarttime = "starttime";
                    var hasAreaOfStudy = "areaOfStudy";
                    var hasSpecialty = "specialty";
                    var hasEventCode = "eventcode";
                    var hasFormat = "format";
                    var itemFilters = [];

                    if (filters.inputs.length == 0) {
                        $("#" + cla.id).parent().addClass('matches');
                    } else {
                        //Loop over each filter
                        filters.inputs.forEach(function (el) {


                            //Check credit filter
                            if (el.name == 'credits') {
                                if (cla.credits.trim() == el.value) {
                                    itemFilters.push(hasCredit);
                                }
                            } else if (el.name == 'specialty') {
                                if (jQuery.inArray(el.value.trim(), cla.specialty) !== -1) {
                                    itemFilters.push(hasSpecialty);
                                }
                            } else if (el.name == 'areaOfStudy') {
                                if (jQuery.inArray(el.value, cla.areaOfStudy) !== -1) {
                                    itemFilters.push(hasAreaOfStudy);
                                }

                            } else if (el.name == 'starttime') {
                                if (cla.starttime.trim() == el.value) {
                                    itemFilters.push(hasStarttime);
                                }
                            } else if (el.name == 'location') {
                                if (cla.location.trim() == el.value) {
                                    itemFilters.push(hasLocation);
                                }
                            } else if (el.name == 'eventcode') {
                                if (cla.id.trim() == el.value.trim()) {
                                    itemFilters.push(hasEventCode);
                                }
                            } else if (el.name == 'format') {
                                if (cla.format == el.value) {
                                    itemFilters.push(hasFormat);
                                }
                            }
                        });

                        var isInputFilterMatch = applyInputFilter(filters.inputs, itemFilters);

                        //All non matching filters get a noMatch css classed applied to be hidden
                        if (isInputFilterMatch) {
                            $("#" + cla.id).parent().addClass('matches');
                        } else {
                            $("#" + cla.id).parent().addClass('noMatches');
                        }
                    }

                });

                //Hide and show all matches and non matches
                $('.noMatches').hide();
                $('.matches').show();

                $('#main_main_MainContent_CpeCalendar').parent('.hidden-results').show();

                // shifted over to apply this after the items are set
                jQuery_1_4_2(".modal[href], .modal a[href]").colorbox();

                return this;    
            }

我认为有更好的方法可以全面实施,但我将尝试回答您的问题

首先,此代码似乎是视图渲染方法的一部分。由于您没有从视图、集合或模型中提供任何其他代码,因此我要问,您是否正确地将视图重新绑定到集合中更新的数据?如果没有,那么根据您提供的这段代码,我认为您可能必须重新呈现视图,以便在收集数据每月更改时,正确地将所有数据/事件绑定加载到收集数据上,因为它可能会丢失:

$('#main_main_MainContent_CpeCalendar').parent('.hidden-results').show();

// shifted over to apply this after the items are set
jQuery_1_4_2(".modal[href], .modal a[href]").colorbox();

return this;    
与其将所有这些都放在视图的
render()
方法中,不如将这些代码分解,使其更具逻辑意义,并使用主干提供的功能?下面是一个使用集合本身的示例(这是一种更合适、更易于维护的方法)

处理主干的筛选。从主干中筛选集合的项目。集合本身,并使用其与数据库的便捷连接(在视图和构成集合的模型之间充当同步)如果用户通过UI启动状态更改以确保数据的完整性,而不是您在这里所做的操作,这将非常方便

如果您可以提供集合、模型和视图中的全部代码,我可能会为您提供更好的答案。根据我在这里看到的,有太多我不知道的变量需要解决