Commit 723b0059 authored by Pascal Hartig's avatar Pascal Hartig

AngularJS: Utilize ngRoute for filters

Supersedes #733

Inline-templating love contributed by @stephenplusplus <3
parent 51172b18
...@@ -2,10 +2,11 @@ ...@@ -2,10 +2,11 @@
"name": "todomvc-angular", "name": "todomvc-angular",
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"angular": "~1.2.1", "angular": "1.2.5",
"todomvc-common": "~0.1.4" "todomvc-common": "~0.1.4"
}, },
"devDependencies": { "devDependencies": {
"angular-mocks": "~1.2.1" "angular-mocks": "1.2.5",
"angular-route": "1.2.5"
} }
} }
<!doctype html> <!doctype html>
<html lang="en" ng-app="todomvc" data-framework="angularjs"> <html lang="en" data-framework="angularjs">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
...@@ -7,60 +7,65 @@ ...@@ -7,60 +7,65 @@
<link rel="stylesheet" href="bower_components/todomvc-common/base.css"> <link rel="stylesheet" href="bower_components/todomvc-common/base.css">
<style>[ng-cloak] { display: none; }</style> <style>[ng-cloak] { display: none; }</style>
</head> </head>
<body> <body ng-app="todomvc">
<section id="todoapp" ng-controller="TodoCtrl"> <ng-view />
<header id="header">
<h1>todos</h1> <script type="text/ng-template" id="todomvc-index.html">
<form id="todo-form" ng-submit="addTodo()"> <section id="todoapp" ng-controller="TodoCtrl">
<input id="new-todo" placeholder="What needs to be done?" ng-model="newTodo" autofocus> <header id="header">
</form> <h1>todos</h1>
</header> <form id="todo-form" ng-submit="addTodo()">
<section id="main" ng-show="todos.length" ng-cloak> <input id="new-todo" placeholder="What needs to be done?" ng-model="newTodo" autofocus>
<input id="toggle-all" type="checkbox" ng-model="allChecked" ng-click="markAll(allChecked)"> </form>
<label for="toggle-all">Mark all as complete</label> </header>
<ul id="todo-list"> <section id="main" ng-show="todos.length" ng-cloak>
<li ng-repeat="todo in todos | filter:statusFilter track by $index" ng-class="{completed: todo.completed, editing: todo == editedTodo}"> <input id="toggle-all" type="checkbox" ng-model="allChecked" ng-click="markAll(allChecked)">
<div class="view"> <label for="toggle-all">Mark all as complete</label>
<input class="toggle" type="checkbox" ng-model="todo.completed"> <ul id="todo-list">
<label ng-dblclick="editTodo(todo)">{{todo.title}}</label> <li ng-repeat="todo in todos | filter:statusFilter track by $index" ng-class="{completed: todo.completed, editing: todo == editedTodo}">
<button class="destroy" ng-click="removeTodo(todo)"></button> <div class="view">
</div> <input class="toggle" type="checkbox" ng-model="todo.completed">
<form ng-submit="doneEditing(todo)"> <label ng-dblclick="editTodo(todo)">{{todo.title}}</label>
<input class="edit" ng-trim="false" ng-model="todo.title" todo-escape="revertEditing(todo)" ng-blur="doneEditing(todo)" todo-focus="todo == editedTodo"> <button class="destroy" ng-click="removeTodo(todo)"></button>
</form> </div>
</li> <form ng-submit="doneEditing(todo)">
</ul> <input class="edit" ng-trim="false" ng-model="todo.title" todo-escape="revertEditing(todo)" ng-blur="doneEditing(todo)" todo-focus="todo == editedTodo">
</form>
</li>
</ul>
</section>
<footer id="footer" ng-show="todos.length" ng-cloak>
<span id="todo-count"><strong>{{remainingCount}}</strong>
<ng-pluralize count="remainingCount" when="{ one: 'item left', other: 'items left' }"></ng-pluralize>
</span>
<ul id="filters">
<li>
<a ng-class="{selected: status == ''} " href="#/">All</a>
</li>
<li>
<a ng-class="{selected: status == 'active'}" href="#/active">Active</a>
</li>
<li>
<a ng-class="{selected: status == 'completed'}" href="#/completed">Completed</a>
</li>
</ul>
<button id="clear-completed" ng-click="clearCompletedTodos()" ng-show="completedCount">Clear completed ({{completedCount}})</button>
</footer>
</section> </section>
<footer id="footer" ng-show="todos.length" ng-cloak> <footer id="info">
<span id="todo-count"><strong>{{remainingCount}}</strong> <p>Double-click to edit a todo</p>
<ng-pluralize count="remainingCount" when="{ one: 'item left', other: 'items left' }"></ng-pluralize> <p>Credits:
</span> <a href="http://twitter.com/cburgdorf">Christoph Burgdorf</a>,
<ul id="filters"> <a href="http://ericbidelman.com">Eric Bidelman</a>,
<li> <a href="http://jacobmumm.com">Jacob Mumm</a> and
<a ng-class="{selected: location.path() == '/'} " href="#/">All</a> <a href="http://igorminar.com">Igor Minar</a>
</li> </p>
<li> <p>Part of <a href="http://todomvc.com">TodoMVC</a></p>
<a ng-class="{selected: location.path() == '/active'}" href="#/active">Active</a>
</li>
<li>
<a ng-class="{selected: location.path() == '/completed'}" href="#/completed">Completed</a>
</li>
</ul>
<button id="clear-completed" ng-click="clearCompletedTodos()" ng-show="completedCount">Clear completed ({{completedCount}})</button>
</footer> </footer>
</section> </script>
<footer id="info">
<p>Double-click to edit a todo</p>
<p>Credits:
<a href="http://twitter.com/cburgdorf">Christoph Burgdorf</a>,
<a href="http://ericbidelman.com">Eric Bidelman</a>,
<a href="http://jacobmumm.com">Jacob Mumm</a> and
<a href="http://igorminar.com">Igor Minar</a>
</p>
<p>Part of <a href="http://todomvc.com">TodoMVC</a></p>
</footer>
<script src="bower_components/todomvc-common/base.js"></script> <script src="bower_components/todomvc-common/base.js"></script>
<script src="bower_components/angular/angular.js"></script> <script src="bower_components/angular/angular.js"></script>
<script src="bower_components/angular-route/angular-route.js"></script>
<script src="js/app.js"></script> <script src="js/app.js"></script>
<script src="js/controllers/todoCtrl.js"></script> <script src="js/controllers/todoCtrl.js"></script>
<script src="js/services/todoStorage.js"></script> <script src="js/services/todoStorage.js"></script>
......
...@@ -7,4 +7,15 @@ ...@@ -7,4 +7,15 @@
* *
* @type {angular.Module} * @type {angular.Module}
*/ */
var todomvc = angular.module('todomvc', []); var todomvc = angular.module('todomvc', ['ngRoute'])
.config(function ($routeProvider) {
$routeProvider.when('/', {
controller: 'TodoCtrl',
templateUrl: 'todomvc-index.html'
}).when('/:status', {
controller: 'TodoCtrl',
templateUrl: 'todomvc-index.html'
}).otherwise({
redirectTo: '/'
});
});
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* - retrieves and persists the model via the todoStorage service * - retrieves and persists the model via the todoStorage service
* - exposes the model to the template and provides event handlers * - exposes the model to the template and provides event handlers
*/ */
todomvc.controller('TodoCtrl', function TodoCtrl($scope, $location, todoStorage, filterFilter) { todomvc.controller('TodoCtrl', function TodoCtrl($scope, $routeParams, todoStorage, filterFilter) {
var todos = $scope.todos = todoStorage.get(); var todos = $scope.todos = todoStorage.get();
$scope.newTodo = ''; $scope.newTodo = '';
...@@ -21,15 +21,12 @@ todomvc.controller('TodoCtrl', function TodoCtrl($scope, $location, todoStorage, ...@@ -21,15 +21,12 @@ todomvc.controller('TodoCtrl', function TodoCtrl($scope, $location, todoStorage,
} }
}, true); }, true);
if ($location.path() === '') { // Monitor the current route for changes and adjust the filter accordingly.
$location.path('/'); $scope.$on('$routeChangeSuccess', function () {
} var status = $scope.status = $routeParams.status || '';
$scope.location = $location; $scope.statusFilter = (status === 'active') ?
{ completed: false } : (status === 'completed') ?
$scope.$watch('location.path()', function (path) {
$scope.statusFilter = (path === '/active') ?
{ completed: false } : (path === '/completed') ?
{ completed: true } : null; { completed: true } : null;
}); });
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment