<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://logicwiki.co.uk/index.php?action=history&amp;feed=atom&amp;title=Grunt_Yeoman_Gulp_Bower</id>
		<title>Grunt Yeoman Gulp Bower - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://logicwiki.co.uk/index.php?action=history&amp;feed=atom&amp;title=Grunt_Yeoman_Gulp_Bower"/>
		<link rel="alternate" type="text/html" href="https://logicwiki.co.uk/index.php?title=Grunt_Yeoman_Gulp_Bower&amp;action=history"/>
		<updated>2026-04-19T14:46:37Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>https://logicwiki.co.uk/index.php?title=Grunt_Yeoman_Gulp_Bower&amp;diff=539&amp;oldid=prev</id>
		<title>Dt1nh6: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://logicwiki.co.uk/index.php?title=Grunt_Yeoman_Gulp_Bower&amp;diff=539&amp;oldid=prev"/>
				<updated>2016-05-09T13:27:40Z</updated>
		
		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;tr style='vertical-align: top;' lang='en'&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 13:27, 9 May 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan='2' style='text-align: center;' lang='en'&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Dt1nh6</name></author>	</entry>

	<entry>
		<id>https://logicwiki.co.uk/index.php?title=Grunt_Yeoman_Gulp_Bower&amp;diff=538&amp;oldid=prev</id>
		<title>Macrop: Created page with &quot;Category:JQuery Category:javascript   The first thing you need to do is install Yeoman, Grunt and Bower. We’re going to use the Node Package Manager to do this all a...&quot;</title>
		<link rel="alternate" type="text/html" href="https://logicwiki.co.uk/index.php?title=Grunt_Yeoman_Gulp_Bower&amp;diff=538&amp;oldid=prev"/>
				<updated>2015-07-13T08:22:38Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;a href=&quot;/index.php?title=Category:JQuery&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Category:JQuery (page does not exist)&quot;&gt;Category:JQuery&lt;/a&gt; &lt;a href=&quot;/index.php?title=Category:Javascript&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Category:Javascript (page does not exist)&quot;&gt;Category:javascript&lt;/a&gt;   The first thing you need to do is install Yeoman, Grunt and Bower. We’re going to use the Node Package Manager to do this all a...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:JQuery]]&lt;br /&gt;
[[Category:javascript]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The first thing you need to do is install Yeoman, Grunt and Bower. We’re going to use the Node Package Manager to do this all at once. In a terminal, run the following: &lt;br /&gt;
 npm install -g yo grunt-cli bower&lt;br /&gt;
&lt;br /&gt;
== Yeoman ==&lt;br /&gt;
Yeoman is used to generate the scaffolding of your app for you. It’ll create the basic folders, files and configurations to get you up and running quickly. Not only that but there are some great custom generators available to create apps of a particular kind – we’re going to use the nifty AngularJS generator.&lt;br /&gt;
&lt;br /&gt;
One of the best features of Yeoman is the ability to use custom generators. We’re going to intall the AngularJS generator to help us get up and running with Angular as quick as possible.&lt;br /&gt;
&lt;br /&gt;
Run the following to install the AngularJS generator:&lt;br /&gt;
&lt;br /&gt;
 npm install -g generator-angular&lt;br /&gt;
Now it’s time to generate a shiny new AngularJS application. In a fresh project directory, run:&lt;br /&gt;
 yo angular &lt;br /&gt;
The generator will ask you a couple of questions. You can answer yes to include Twitter’s bootstrap. Also answer yes to include ngResource. The rest we won’t need for now so answer no.&lt;br /&gt;
&lt;br /&gt;
Yeoman will create your files and folders, then it will run bower install (more on this in a moment) and npm install to fetch any dependencies and lastly it’ll perform any mandatory configuration.&lt;br /&gt;
=== What’s in the box? ===&lt;br /&gt;
Let’s take a look at what Yeoman’s given us:&lt;br /&gt;
&lt;br /&gt;
* .bowerrc&lt;br /&gt;
* .editorconfig&lt;br /&gt;
* .gitattributes&lt;br /&gt;
* .gitignore&lt;br /&gt;
* .jshintrc&lt;br /&gt;
* Gruntfile.js&lt;br /&gt;
* app/&lt;br /&gt;
* component.json&lt;br /&gt;
* karma-e2e.conf.js&lt;br /&gt;
* karma.conf.js&lt;br /&gt;
* node_modules/&lt;br /&gt;
* package.json&lt;br /&gt;
* test/&lt;br /&gt;
&lt;br /&gt;
Let’s go over some of the more important things to notice here:&lt;br /&gt;
&lt;br /&gt;
==== app/ directory ====&lt;br /&gt;
The app directory contains your static app. It has your html, css and javascript in it and it’s where you’ll spend most of your time developing.&lt;br /&gt;
==== package.json ====&lt;br /&gt;
The package.json file helps npm to identify our project as well as to manage all of it’s dependencies. It can also contain all sorts of other metadata relevant to your project.&lt;br /&gt;
node_modules&lt;br /&gt;
This one is self explanatory. This is where all the node modules that your project depends on are stored.&lt;br /&gt;
==== Gruntfile.js ====&lt;br /&gt;
The Gruntfile is a javascript file that is responsible for configuring your project as well as any tasks or plugins that your project requires. For instance, your gruntfile might specify that your project uses Uglify and that you want it to run uglify on a particular directory at build time. More about Grunt in a moment.&lt;br /&gt;
==== component.json ====&lt;br /&gt;
The component.json file is used to inform the Bower package manager of your projects dependencies as well as other metadata. In recent versions of Bower this file is called bower.json – more on that in a moment.&lt;br /&gt;
==== .bowerrc ====&lt;br /&gt;
The .bowerrc file is used to pass general config options to bower.&lt;br /&gt;
==== Karma files ====&lt;br /&gt;
Karma is a testing framework. We’ll use it to run a few tests for our Angular app.&lt;br /&gt;
&lt;br /&gt;
Phew! That’s quite a lot to take in – once you get more familiar with the output of a yeoman generator however, you’ll learn to love the fact that it handles all of this for you!&lt;br /&gt;
&lt;br /&gt;
Let’s add a few more things to our project before we start get on to some actual development.&lt;br /&gt;
&lt;br /&gt;
== Bower – A package manager for the web ==&lt;br /&gt;
&lt;br /&gt;
Before we use Bower, there’s a small bit of config we have to do ourselves. Bower recently changed their naming convention of component.json files to bower.json files so we need to bring our code base in line with that.&lt;br /&gt;
&lt;br /&gt;
The first thing we need to do is make a small change to our Bower config in .bowerrc so open it up and add the following line:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;directory&amp;quot;: &amp;quot;app/components&amp;quot;,&lt;br /&gt;
      &amp;quot;json&amp;quot;: &amp;quot;bower.json&amp;quot; // Add this line&lt;br /&gt;
  }&lt;br /&gt;
What this does, is it tells Bower to use a package’s bower.json file for instructions on how to install that package.&lt;br /&gt;
&lt;br /&gt;
Since we’re using bower for our own project’s dependencies, we’ll need to rename the component.json file in our project root to bower.json as well. A small ask when using such cutting edge technologies :)&lt;br /&gt;
&lt;br /&gt;
=== Bower === &lt;br /&gt;
Bower is a package manager. It will help us to quickly find and install our favourite CSS frameworks, javascript libraries and plugins with just a few simple commands.&lt;br /&gt;
&lt;br /&gt;
Ok, let’s give Bower a whirl. Yeoman kindly used bower to install Bootstrap for us earlier, but that was just the Bootstrap CSS. We want all the nifty Javascript widgets as well.&lt;br /&gt;
&lt;br /&gt;
Since we’re building an AngularJS app, we’ll need Bootstrap javascript that works with Angular.&lt;br /&gt;
&lt;br /&gt;
Luckily, the team over at Angular UI have ported all the Bootstrap Javascript into Angular!. Let’s use Bower to install their library.&lt;br /&gt;
&lt;br /&gt;
 bower install angular-bootstrap --save&lt;br /&gt;
The –save flag tells bower to add this to our bower.json file as a dependency&lt;br /&gt;
&lt;br /&gt;
Fantastic! That was easy wasn’t it? Now, navigate into your app/ directory and let’s see what we’ve got to work with.&lt;br /&gt;
&lt;br /&gt;
=== Our static app ===&lt;br /&gt;
&lt;br /&gt;
Take a look at the contents of the app/ directory.&lt;br /&gt;
&lt;br /&gt;
* favicon.ico&lt;br /&gt;
* index.html&lt;br /&gt;
* robots.txt&lt;br /&gt;
* components/&lt;br /&gt;
* scripts/&lt;br /&gt;
* styles/&lt;br /&gt;
* views/&lt;br /&gt;
* index.html&lt;br /&gt;
&lt;br /&gt;
This should be familiar to most of you, this is the core html page of your app.&lt;br /&gt;
==== components/ directory ====&lt;br /&gt;
The components directory is like the node_modules directory but for Bower. It’s where all the packages you install with Bower will be kept. AngularUI Bootstrap, for instance, will be in there.&lt;br /&gt;
==== scripts/ directory ====&lt;br /&gt;
Again, familiar territory to most. This is where your apps javascript is stored. Note that libraries such as AngularJS will exist in the components directory, so scripts/ is for your files that you write!&lt;br /&gt;
==== styles/ directory ====&lt;br /&gt;
All your css/sass to make your app look moar pretty.&lt;br /&gt;
==== Views ====&lt;br /&gt;
This nifty folder is where your Angular Templates will reside.&lt;br /&gt;
&lt;br /&gt;
Next up we’ll take a closer look at the AngularJS files&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
&lt;br /&gt;
The Yeoman Angular generator has given us the bare essentials: A module, a controller and a view. Let’s take a look at each of those:&lt;br /&gt;
&lt;br /&gt;
=== The Module: /app/scripts/app.js ===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;brush:java;&amp;quot;&amp;gt;&lt;br /&gt;
'use strict';&lt;br /&gt;
// Here we set up an angular module. We'll attach controllers and &lt;br /&gt;
// other components to this module.&lt;br /&gt;
angular.module('testApp', [])&lt;br /&gt;
  // Angular supports chaining, so here we chain the config function onto&lt;br /&gt;
  // the module we're configuring.&lt;br /&gt;
  .config(function ($routeProvider) {&lt;br /&gt;
 &lt;br /&gt;
    // We use AngularJS dependency injection to fetch the route provider.&lt;br /&gt;
    // The route provider is used to setup our app's routes. &lt;br /&gt;
 &lt;br /&gt;
    // The config below simply says when you visit '/' it'll render&lt;br /&gt;
    // the views/main.html template controlled by the MainCtrl controller.&lt;br /&gt;
 &lt;br /&gt;
    // The otherwise method specifies what the app should do if it doesn't recognise &lt;br /&gt;
    // the route entered by a user. In this case, redirect to home.&lt;br /&gt;
    $routeProvider&lt;br /&gt;
      .when('/', {&lt;br /&gt;
        templateUrl: 'views/main.html',&lt;br /&gt;
        controller: 'MainCtrl'&lt;br /&gt;
      })&lt;br /&gt;
      .otherwise({&lt;br /&gt;
        redirectTo: '/'&lt;br /&gt;
      });&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== The Controller: /app/scripts/controllers/main.js ===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;brush:java;&amp;quot;&amp;gt;&lt;br /&gt;
'use strict';&lt;br /&gt;
 &lt;br /&gt;
  // Here we attach this controller to our testApp module&lt;br /&gt;
  angular.module('testApp')&lt;br /&gt;
  &lt;br /&gt;
    // The controller function let's us give our controller a name: MainCtrl&lt;br /&gt;
    // We'll then pass an anonymous function to serve as the controller itself.&lt;br /&gt;
    .controller('MainCtrl', function ($scope) {&lt;br /&gt;
  &lt;br /&gt;
      // Using AngularJS dependency injection, we've injected the $scope variable&lt;br /&gt;
      // Anything we attach to scope will be available to us in the view.&lt;br /&gt;
  &lt;br /&gt;
      // In this case, we're attaching a collection of Awesome Things to display&lt;br /&gt;
      // in app/views/main.html&lt;br /&gt;
      $scope.awesomeThings = [&lt;br /&gt;
        'HTML5 Boilerplate',&lt;br /&gt;
        'AngularJS',&lt;br /&gt;
        'Karma'&lt;br /&gt;
      ];&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== The View: app/views/main.html ===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;brush:xml;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;hero-unit&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;'Allo, 'Allo!&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;You now have&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;!-- Here we use the AngularJS directive: ng-repeat to loop through our awesomeThings &lt;br /&gt;
        and print them out as list items using the {{}} bindings --&amp;gt;&lt;br /&gt;
        &amp;lt;li ng-repeat=&amp;quot;thing in awesomeThings&amp;quot;&amp;gt;{{thing}}&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;installed.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;Enjoy coding! - Yeoman&amp;lt;/h3&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
=== The Index File: app/index.html ===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;brush:xml;&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!doctype html&amp;gt;&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;...&amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;!-- The ng-app directive tells angular which module we'll use&lt;br /&gt;
    for our app. In this case the one defined in scripts/app.js --&amp;gt;&lt;br /&gt;
    &amp;lt;body ng-app=&amp;quot;testApp&amp;quot;&amp;gt;&lt;br /&gt;
      ...&lt;br /&gt;
      &amp;lt;!-- The ng-view directive specifies that our templates&lt;br /&gt;
      (such as views/main.html) will be loaded into this div. --&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;container&amp;quot; ng-view&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
      &amp;lt;!-- Here we load AngularJS and the AngularJS resource component --&amp;gt;&lt;br /&gt;
      &amp;lt;script src=&amp;quot;components/angular/angular.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
      &amp;lt;script src=&amp;quot;components/angular-resource/angular-resource.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
      &amp;lt;!-- Here we include our own angular scripts --&amp;gt;&lt;br /&gt;
      &amp;lt;!-- build:js scripts/scripts.js --&amp;gt;&lt;br /&gt;
      &amp;lt;script src=&amp;quot;scripts/app.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
      &amp;lt;script src=&amp;quot;scripts/controllers/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
      &amp;lt;!-- endbuild --&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
      ...&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Let’s see it in action! ==&lt;br /&gt;
We’re ready to take our first look at our application. Navigate back to the root directory of your app and run:&lt;br /&gt;
&lt;br /&gt;
 grunt server&lt;br /&gt;
=== Grunt === &lt;br /&gt;
Grunt is a powerful, feature rich task runner for Javascript. In brief, it lets you automate repetitive tasks like compiling coffeescript, minifying css, code validation etc. We’ll be using it to do all of that as well as prepare our code for development and deployment.&lt;br /&gt;
&lt;br /&gt;
Grunt is going to whip through our project folder and prepare everything for us such as compiling our included Bootstrap SASS down to css.&lt;br /&gt;
&lt;br /&gt;
After a few seconds a browser window should pop up with your app running and looking all fancy.&lt;br /&gt;
&lt;br /&gt;
Just to be sure, view the source of the page and take a look at the main.css file that’s included. It should be full of Bootstrap code – thanks to the magic of Bower and Grunt.&lt;br /&gt;
&lt;br /&gt;
== Let’s change it up ==&lt;br /&gt;
&lt;br /&gt;
It’s about time to try our hand at making some changes. Since this is Angular, we’ll start with some AngularJS Testing.&lt;br /&gt;
&lt;br /&gt;
Yeoman was kind enough to generate an example test for our controller, so let’s start there.&lt;br /&gt;
&lt;br /&gt;
We’re going to add another thing to our list of awesome things so open test/spec/controllers/main.js and let’s change our test to expect 4 awesome things instead of 3:&lt;br /&gt;
&lt;br /&gt;
=== test/spec/controllers/main.js ===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;brush:java;&amp;quot;&amp;gt;&lt;br /&gt;
'use strict';&lt;br /&gt;
 &lt;br /&gt;
describe('Controller: MainCtrl', function () {&lt;br /&gt;
 &lt;br /&gt;
  // load the controller's module&lt;br /&gt;
  beforeEach(module('testApp'));&lt;br /&gt;
 &lt;br /&gt;
  var MainCtrl,&lt;br /&gt;
    scope;&lt;br /&gt;
 &lt;br /&gt;
  // Initialize the controller and a mock scope&lt;br /&gt;
  beforeEach(inject(function ($controller, $rootScope) {&lt;br /&gt;
    scope = $rootScope.$new();&lt;br /&gt;
    MainCtrl = $controller('MainCtrl', {&lt;br /&gt;
      $scope: scope&lt;br /&gt;
 &lt;br /&gt;
    });&lt;br /&gt;
  }));&lt;br /&gt;
 &lt;br /&gt;
  it('should attach a list of awesomeThings to the scope', function () {&lt;br /&gt;
    // Change this line&lt;br /&gt;
    expect(scope.awesomeThings.length).toBe(3);&lt;br /&gt;
 &lt;br /&gt;
    // To this&lt;br /&gt;
    expect(scope.awesomeThings.length).toBe(4);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now we can use another great feature of Grunt:&lt;br /&gt;
&lt;br /&gt;
 grunt test&lt;br /&gt;
This will run our Karma tests. They should fail because the test expects 4 awesomeThings and we still only have 3. Let’s go fix that to make our tests pass.&lt;br /&gt;
&lt;br /&gt;
Open app/scripts/controllers/main.js and add another awesome thing to the list:&lt;br /&gt;
&lt;br /&gt;
=== /app/scripts/controllers/main.js ===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;brush:java;&amp;quot;&amp;gt;&lt;br /&gt;
.controller('MainCtrl', function ($scope) {&lt;br /&gt;
  $scope.awesomeThings = [&lt;br /&gt;
    'HTML5 Boilerplate',&lt;br /&gt;
    'AngularJS',&lt;br /&gt;
    'Karma',&lt;br /&gt;
    'SitePoint'&lt;br /&gt;
  ];&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Save the file and run the tests again:&lt;br /&gt;
&lt;br /&gt;
 grunt test&lt;br /&gt;
This time they should pass. Now you can fire up the app in your browser (grunt server) and notice that there’s an additional bullet point. Neat huh?&lt;br /&gt;
&lt;br /&gt;
== Using our Bower included package ==&lt;br /&gt;
&lt;br /&gt;
Let’s use the AngularUI Bootstrap library that we included earlier to turn our list of awesomeThings into a dropdown of awesomeThings.&lt;br /&gt;
&lt;br /&gt;
Important Since Bower is just a package manager, it’s not responsible for adding our files to our index.html file. We need to do that ourselves.&lt;br /&gt;
&lt;br /&gt;
So open up app/index.html and add the following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;brush:xml;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;components/angular-bootstrap/ui-bootstrap.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, as per the Getting Started documentation on AngularUI Bootstrap’s site, we need to add their module as a dependency to our own Angular module&lt;br /&gt;
&lt;br /&gt;
Open app/scripts/app.js and add the ui.bootstrap module as a dependency:&lt;br /&gt;
&lt;br /&gt;
=== /app/scripts/app.js ===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;brush:java;&amp;quot;&amp;gt;&lt;br /&gt;
'use strict';&lt;br /&gt;
 &lt;br /&gt;
angular.module('testApp', ['ui.bootstrap'])&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alright it’s ready to use. Now we need to make a few changes to our view:&lt;br /&gt;
&lt;br /&gt;
=== The View: app/views/main.html ===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;brush:xml;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li class=&amp;quot;dropdown&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;dropdown-toggle&amp;quot;&amp;gt;&lt;br /&gt;
      Click me to see some awesome things!&lt;br /&gt;
    &amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;ul class=&amp;quot;dropdown-menu&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;li ng-repeat=&amp;quot;thing in awesomeThings&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;a&amp;gt;{{thing}}&amp;lt;/a&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
We’ve used some bootstrap css classes, and moved our ng-repeat to create menu items instead of just a plain old list.&lt;br /&gt;
&lt;br /&gt;
AngularUI Bootstrap directives work on classes, so simply by adding the dropdown-toggle class to our tag we’ll have a fully functioning dropdown!&lt;br /&gt;
&lt;br /&gt;
We will need to add the Bootstrap UI module to our tests otherwise they’ll fail so make the following changes:&lt;br /&gt;
&lt;br /&gt;
=== test/spec/controllers/main.js ===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;brush:java;&amp;quot;&amp;gt;&lt;br /&gt;
'use strict';&lt;br /&gt;
 &lt;br /&gt;
describe('Controller: MainCtrl', function () {&lt;br /&gt;
 &lt;br /&gt;
  // load the controller's module&lt;br /&gt;
  beforeEach(module('testApp'));&lt;br /&gt;
  // load the BootstrapUI module&lt;br /&gt;
  beforeEach(module('ui.bootstrap')); // Add this line&lt;br /&gt;
 ...&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== /karma.conf.js ===&lt;br /&gt;
&amp;lt;pre class=&amp;quot;brush:java;&amp;quot;&amp;gt;&lt;br /&gt;
// Karma configuration&lt;br /&gt;
 &lt;br /&gt;
// base path, that will be used to resolve files and exclude&lt;br /&gt;
basePath = '';&lt;br /&gt;
 &lt;br /&gt;
// list of files / patterns to load in the browser&lt;br /&gt;
files = [&lt;br /&gt;
  JASMINE,&lt;br /&gt;
  JASMINE_ADAPTER,&lt;br /&gt;
  'app/components/angular/angular.js',&lt;br /&gt;
  'app/components/angular-mocks/angular-mocks.js',&lt;br /&gt;
  'app/components/angular-bootstrap/ui-bootstrap.js', // Add this line&lt;br /&gt;
  'app/scripts/*.js',&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Run grunt test to make sure everything passes&lt;br /&gt;
&lt;br /&gt;
Now you can open up your app in the browser (grunt server) once more and take a look at your handy work.&lt;br /&gt;
&lt;br /&gt;
--------------------&lt;br /&gt;
http://www.sitepoint.com/kickstart-your-angularjs-development-with-yeoman-grunt-and-bower/&lt;/div&gt;</summary>
		<author><name>Macrop</name></author>	</entry>

	</feed>