Outline
To begin this tutorial, we're going to start with the Angular side of things. AngularJS is a frontend framework developed by Google with the goal of making single page web applications easier to build, test, and maintain. Throughout this tutorials, we'll be linking to our A Better Way to Learn Angular guide which can provide supplementary information.
Without further ado, let's jump in...
Getting Started
As mentioned before, this tutorial will take you through building out a Hacker News/Reddit clone, which we're going to name "Flapper News". To keep things simple, we're going to kick things off with two files.
index.html
(for writing the template) and app.js
(for defining our AngularJS logic)
To begin, our index.html
will look like this:
<html>
<head>
<title>My Angular App!</title>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>
<script src="app.js"></script>
</head>
<body ng-app="flapperNews" ng-controller="MainCtrl">
<div>
{{test}}
</div>
</body>
</html>
Our app.js
is going to look like this:
angular.module('flapperNews', [])
.controller('MainCtrl', [
'$scope',
function($scope){
$scope.test = 'Hello world!';
}]);
With these several lines of code, we've set up a new AngularJS app and created
a new controller. You'll notice that we declare a variable test
in the controller and display its contents
using the AngularJS {{}}
notation. This is demonstrating one of the most powerful features of
AngularJS, which is its two-way data-bindings.
Displaying Lists
One thing that's is going to be absolutely fundamental to our app is displaying lists. Fortunately, angular makes this really easy using the ng-repeat directive.
$scope
variable that defines a list of post
titles on line 8 in app.js
:
$scope.posts = [
'post 1',
'post 2',
'post 3',
'post 4',
'post 5'
];
The
$scope
variable serves as the bridge between Angular controllers and Angular templates. If you want something to be accessible in the template such as a function or variable, bind it to$scope
ng-repeat
to do it. Add the following code to line 8 of index.html,
replacing the div that was there before:
<div ng-repeat="post in posts">
{{post}}
</div>
When you refresh the page you should see a list of posts!
Now what if we want to display additional information about our posts?
ng-repeat
lets us do that too!
posts
object to include some
additional information we might be interested in displaying like the number of
upvotes:
$scope.posts = [
{title: 'post 1', upvotes: 5},
{title: 'post 2', upvotes: 2},
{title: 'post 3', upvotes: 15},
{title: 'post 4', upvotes: 9},
{title: 'post 5', upvotes: 4}
];
ng-repeat
directive to display the new information:
<div ng-repeat="post in posts">
{{post.title}} - upvotes: {{post.upvotes}}
</div>
Of course it is important to order posts by number of upvotes, and we can tap into an angular filter to make it happen.
<div ng-repeat="post in posts | orderBy: '-upvotes'">
{{post.title}} - upvotes: {{post.upvotes}}
</div>
AngularJS comes with several built in filters but you can also write custom filters tailored to your specific needs.