Cartucho Cartucho - 2 years ago 69
AngularJS Question

Search Toolbar with AngularJS

This is a newbie question about Angular 1.4.

My Main Question

I have the following search view:

'use strict';

var module = angular.module('', ['ngRoute', 'ngResource']);

module.config(function ($routeProvider) {
$routeProvider.when('/search', {
templateUrl: 'search/search.html',
controller: 'SearchCtrl'

module.factory('Search', function ($resource) {

return $resource('', {}, {
query: {
method: 'GET',
params: {},
isArray: false

module.controller('SearchCtrl', function ($scope, Search) {
$scope.results = [];
$scope.query = '';
$scope.doSearch = function (query) {
Search.query({q: query}).$promise.then(function (result) {
$scope.results = result.results;

And the partial HTML (search.html):


<input placeholder="search" ng-model="query" />
<button ng-click="doSearch(query)" />
<li ng-repeat="result in results">{{ result }}</li>

This works perfectly, the problem is when I want to put the search input in a toolbar (defined in index.html):


<div ng-controller="SearchCtrl">
<div class="toolbar">
<input placeholder="search" ng-model="query" />
<button ng-click="doSearch(query)">

In this case, by pushing the search button the query is executed in the back-end but the results are not updated in $scope. what's wrong? I've tried calling $scope.$apply() with no luck. I'm lost with this.

Bonus Question

Given that the search functionality is in the toolbar (always visible) users can execute queries in any place of the website. How can I redirect the response to

Thanks in advance.

Answer Source

You have two distinct instances of SearchCtrl, each with its own distinct scope: one in the navbar (dur to ng-controller="SearchCtrl"), and one in the main view (due to controller: 'SearchCtrl').

So the search in the navbar modifies the scope of the navbar controller, and the scope of the main view doesn't know anything about it.

If you want to got to the search main view when something is searched in the navbar, simply use

$location.url('/search?query=' + theEncodedQueryTypedByTheUser);

And in the search route's resolve function, or in its controller, get the route param named query, send the HTTP request, and update the scope with the results.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download