I have created a search box which is being used on two different views, one is for searching jobs and the other is for searching companies. I have made two separate controllers for both and separate services as well.
Here is the html for the searchbox -
<span class="searchButton"><i class="fa fa-search fa-2x"></i></span> <input ng-change="companies.search()" ng-model="companies.searchTerm" ng-keydown="companies.deleteTerm($event)" type="text" id="search-box" style="width: 0px; visibility:hidden;"/>
Here is a script i am using for styling it -
<script type="text/javascript"> var toggleVar = true; $('.searchButton').on('click', function() { if(toggleVar) { $('.searchButton').animate({right: '210px'}, 400); $('#search-box').css("visibility", "visible"); setTimeout(function() { $('.searchButton').css("color", "#444444"); }, 200); $('#search-box').animate({ width: 185 }, 400).focus(); toggleVar = false; } else { $('#search-box').animate({ width: 0 }, 400); $('.searchButton').animate({right: '25px'}, 400); setTimeout(function() { $('.searchButton').css("color", "#eeeeee"); }, 300); toggleVar = true; } }); $('#search-box').focusout(function() { if(!toggleVar) { $('#search-box').animate({ width: 0 }, 400); $('.searchButton').animate({right: '25px'}, 400); setTimeout(function() { $('.searchButton').css("color", "#eeeeee"); }, 300); toggleVar = true; } }); </script>
Controller -
angular.module('jobSeekerApp') .controller('CompaniesallCtrl', ['getAllCompanies', function (companiesService) { var ctrl = this; var count; ctrl.pageNumber = 1; ctrl.searchPageNumber = 1; ctrl.isSearching = false; ctrl.searchTerm = ""; // Initial page load companiesService.getCompanies(ctrl.pageNumber) .then(function(response) { ctrl.companiesList = response.data.results; count = response.data.count; checkCount(); }, function(error) { console.log(error); }); // User clicks next button ctrl.getNext = function() { // If search is not being used if(ctrl.searchTerm === "" && ctrl.isSearching === false) { ctrl.pageNumber = ctrl.pageNumber + 1; companiesService.getCompanies(ctrl.pageNumber) .then(function(response) { ctrl.companiesList = ctrl.companiesList.concat(response.data.results); checkCount(); }, function(error) { console.log(error); }); } // If search is being used else { ctrl.searchPageNumber = ctrl.searchPageNumber + 1; companiesService.searchCompany(ctrl.searchPageNumber, ctrl.searchTerm) .then(function(response) { ctrl.companiesList = ctrl.companiesList.concat(response.data.results); checkCount(); }, function(error) { console.log(error); }); } }; // User backspaces to delete search term ctrl.deleteTerm = function (event) { if(event.keyCode === 8) { ctrl.searchTermLen = ctrl.searchTermLen - 1; } // If search box is empty ctrl.isSearching = ctrl.searchTermLen !== 0; }; // User clicks search button ctrl.search = function() { ctrl.searchTermLen = ctrl.searchTerm.length; // If search box is empty, show normal results if(ctrl.searchTerm === "" && ctrl.isSearching === false) { ctrl.pageNumber = 1; companiesService.getCompanies(ctrl.pageNumber) .then(function(response) { ctrl.companiesList = response.data.results; count = response.data.count; checkCount(); }, function(error) { console.log(error); }); } // If search box is not empty, search the input else { ctrl.isSearching = true; ctrl.searchPageNumber = 1; companiesService.searchCompany(ctrl.searchPageNumber, ctrl.searchTerm) .then(function(response) { ctrl.companiesList = response.data.results; count = response.data.count; checkCount(); }, function(error) { console.log(error); }); } }; // Function to hide and show next button function checkCount() { console.log(count); $(".nextButton").toggle(count > 10); count = count - 10; } }]);
I am trying to make a directive for this, since all this code is being repeated for the both the views. But how do I make the directive interact with different controllers. And how do i make this part ng-change="companies.search()" ng-model="companies.searchTerm" ng-keydown="companies.deleteTerm($event)"
not dependent on the controllers. I am new to angular and am not sure if this is the right approach or should i let the keep the code separate? Please help.