Глубоко настраиваемый фильтр в AngularJS


Мне нужно фильтровать проекты, используя строку поиска, он должен фильтровать все свойства проектов с несколькими исключениями. Это работает, но очень медленно, где я могу сделать оптимизацию?
В "_" из библиотеки underscore.js

<div class="fixed-header">
    <form>
        <div class="form-group">
            <input type="text" ng-model="searchText" class="form-control" placeholder="Suche..."/>
        </div>
    </form>
</div>

<ul>
    <li class="initial" 
        ng-repeat-start="(customer, projectGroup) in projects | searchProjects:searchText">
       {{customer}}
    </li>
</ul>

Вот фильтр:

.filter('searchProjects', ($rootScope, $filter) => {
    return (projects, query) => {
        if (projects) {
            var passFilter = projects.filter(p => {
                let backUpContacts = false;
                if (p) {

                    //If project has customer and customer has references, don't search in all of them
                    if (p.kunde && p.kunde.contacts) {
                        backUpContacts = p.kunde.contacts.concat([]);
                        //Only leave the selected Reference Contact in Customer's Contacts for Search
                        p.kunde.contacts = p.kunde.contacts.filter(contact => p.reference === contact.id);
                    }

                    //Search also for project leaders that have to be found first
                    let projectLeaders = [];
                    $rootScope.profiles.forEach(profile => {
                        profile.projects.forEach(role => {
                            if (role.project === p.id) {
                                let projectRole = role.masterData['Projektrolle'];
                                if (projectRole && ~projectRole.indexOf(864)) {
                                    projectLeaders.push(profile.firstName + " " + profile.lastName);
                                }
                            }
                        });
                    });
                    p["projectLeaders"] = projectLeaders;
                }
                let pContain = _.contains($filter('filter')(projects, query), p);
                delete p["projectLeaders"];
                if (backUpContacts) {
                    p.kunde.contacts = backUpContacts;
                }
                return pContain;
            });
            return passFilter;
        }
    };
})


Комментарии
1 ответ

Я пытался улучшить себя, и это гораздо быстрее, чем раньше!
Вот мой новый код, не стесняйтесь комментировать то, что можно дополнительно сделать, чтобы улучшить его.

    .filter('searchProjects', ($rootScope, $filter) => {
return (projects, query) => {
if (projects) {
//Create project leader search object
let projectLeaders = {};
$rootScope.profiles.forEach(profile => {
profile.projects.forEach(role => {
let projectRole = role.masterData['Projektrolle'];
//864 = Projectleader Tag ID
if (projectRole && ~projectRole.indexOf(864)) {
let projectLeader = profile.firstName + " " + profile.lastName;
if (projectLeaders.hasOwnProperty(role.project)) {
projectLeaders[role.project].push(projectLeader);
} else {
projectLeaders[role.project] = [projectLeader];
}
}
});
});

return projects.filter(p => {
//delete customers' contacts to exclude from search
if (p.kunde && p.kunde.contacts) {
//Only leave the selected Reference Contact in Customer's Contacts for Search
p.kunde.contacts = p.kunde.contacts.filter(contact => p.reference === contact.id);
}
//if project has leaders, add them to it for searching
if (projectLeaders.hasOwnProperty(p.id)) {
p["projectLeaders"] = projectLeaders[p.id];
}
return Boolean($filter('filter')([p], query).length);
});
}
};
})

0
ответ дан 7 марта 2018 в 11:03 Источник Поделиться