TodoMVC using AngularJS
How do I make an todomvc using angularjs?
A TodoMVC example using AngularJS from http://todomvc.com, a project which offers the same Todo application implemented using MV* concepts in most of the popular JavaScript MV* frameworks of today and helps developers select an MV* framework for structuring and organizing their JavaScript web apps.. What is a todomvc using angularjs? How do you make a todomvc using angularjs? This script and codes were developed by Victor Yan on 05 January 2023, Thursday.
TodoMVC using AngularJS - Script Codes HTML Codes
<!DOCTYPE html>
<html >
<head> <meta charset="UTF-8"> <title>TodoMVC using AngularJS</title> <link rel="stylesheet" href="css/style.css">
</head>
<body> <html lang="en" data-framework="angularjs"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>AngularJS • TodoMVC</title> </head> <body ng-app="todomvc"> <ng-view /> <script type="text/ng-template" id="todomvc-index.html"> <section id="todoapp" ng-controller="TodoCtrl"> <header id="header"> <h1>todos</h1> <form id="todo-form" ng-submit="addTodo()"> <input id="new-todo" placeholder="What needs to be done?" ng-model="newTodo" autofocus> </form> </header> <section id="main" ng-show="todos.length" ng-cloak> <input id="toggle-all" type="checkbox" ng-model="allChecked" ng-click="markAll(allChecked)"> <label for="toggle-all">Mark all as complete</label> <ul id="todo-list"> <li ng-repeat="todo in todos | filter:statusFilter track by $index" ng-class="{completed: todo.completed, editing: todo == editedTodo}"> <div class="view"> <input class="toggle" type="checkbox" ng-model="todo.completed"> <label ng-dblclick="editTodo(todo)">{{todo.title}}</label> <button class="destroy" ng-click="removeTodo(todo)"></button> </div> <form ng-submit="doneEditing(todo)"> <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> <footer id="info"> <p>Double-click to edit a todo</p> <p>Credits: <a href="https://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> </body>
</html> <script src='https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.17/angular.min.js'></script>
<script src='https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.17/angular-route.min.js'></script> <script src="js/index.js"></script>
</body>
</html>
TodoMVC using AngularJS - Script Codes CSS Codes
html,
body { margin: 0; padding: 0;
}
button { margin: 0; padding: 0; border: 0; background: none; font-size: 100%; vertical-align: baseline; font-family: inherit; color: inherit; -webkit-appearance: none; -ms-appearance: none; -o-appearance: none; appearance: none;
}
body { font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 1.4em; background: #eaeaea url('bg.png'); color: #4d4d4d; width: 550px; margin: 0 auto; -webkit-font-smoothing: antialiased; -moz-font-smoothing: antialiased; -ms-font-smoothing: antialiased; -o-font-smoothing: antialiased; font-smoothing: antialiased;
}
button,
input[type="checkbox"] { outline: none;
}
#todoapp { background: #fff; background: rgba(255, 255, 255, 0.9); margin: 130px 0 40px 0; border: 1px solid #ccc; position: relative; border-top-left-radius: 2px; border-top-right-radius: 2px; box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.15);
}
#todoapp:before { content: ''; border-left: 1px solid #f5d6d6; border-right: 1px solid #f5d6d6; width: 2px; position: absolute; top: 0; left: 40px; height: 100%;
}
#todoapp input::-webkit-input-placeholder { font-style: italic;
}
#todoapp input::-moz-placeholder { font-style: italic; color: #a9a9a9;
}
#todoapp h1 { position: absolute; top: -120px; width: 100%; font-size: 70px; font-weight: bold; text-align: center; color: #b3b3b3; color: rgba(255, 255, 255, 0.3); text-shadow: -1px -1px rgba(0, 0, 0, 0.2); -webkit-text-rendering: optimizeLegibility; -moz-text-rendering: optimizeLegibility; -ms-text-rendering: optimizeLegibility; -o-text-rendering: optimizeLegibility; text-rendering: optimizeLegibility;
}
#header { padding-top: 15px; border-radius: inherit;
}
#header:before { content: ''; position: absolute; top: 0; right: 0; left: 0; height: 15px; z-index: 2; border-bottom: 1px solid #6c615c; background: #8d7d77; background: -webkit-gradient(linear, left top, left bottom, from(rgba(132, 110, 100, 0.8)),to(rgba(101, 84, 76, 0.8))); background: -webkit-linear-gradient(top, rgba(132, 110, 100, 0.8), rgba(101, 84, 76, 0.8)); background: linear-gradient(top, rgba(132, 110, 100, 0.8), rgba(101, 84, 76, 0.8)); filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670'); border-top-left-radius: 1px; border-top-right-radius: 1px;
}
#new-todo,
.edit { position: relative; margin: 0; width: 100%; font-size: 24px; font-family: inherit; line-height: 1.4em; border: 0; outline: none; color: inherit; padding: 6px; border: 1px solid #999; box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2); -moz-box-sizing: border-box; -ms-box-sizing: border-box; -o-box-sizing: border-box; box-sizing: border-box; -webkit-font-smoothing: antialiased; -moz-font-smoothing: antialiased; -ms-font-smoothing: antialiased; -o-font-smoothing: antialiased; font-smoothing: antialiased;
}
#new-todo { padding: 16px 16px 16px 60px; border: none; background: rgba(0, 0, 0, 0.02); z-index: 2; box-shadow: none;
}
#main { position: relative; z-index: 2; border-top: 1px dotted #adadad;
}
label[for='toggle-all'] { display: none;
}
#toggle-all { position: absolute; top: -42px; left: -4px; width: 40px; text-align: center; /* Mobile Safari */ border: none;
}
#toggle-all:before { content: '»'; font-size: 28px; color: #d9d9d9; padding: 0 25px 7px;
}
#toggle-all:checked:before { color: #737373;
}
#todo-list { margin: 0; padding: 0; list-style: none;
}
#todo-list li { position: relative; font-size: 24px; border-bottom: 1px dotted #ccc;
}
#todo-list li:last-child { border-bottom: none;
}
#todo-list li.editing { border-bottom: none; padding: 0;
}
#todo-list li.editing .edit { display: block; width: 506px; padding: 13px 17px 12px 17px; margin: 0 0 0 43px;
}
#todo-list li.editing .view { display: none;
}
#todo-list li .toggle { text-align: center; width: 40px; /* auto, since non-WebKit browsers doesn't support input styling */ height: auto; position: absolute; top: 0; bottom: 0; margin: auto 0; /* Mobile Safari */ border: none; -webkit-appearance: none; -ms-appearance: none; -o-appearance: none; appearance: none;
}
#todo-list li .toggle:after { content: '✔'; /* 40 + a couple of pixels visual adjustment */ line-height: 43px; font-size: 20px; color: #d9d9d9; text-shadow: 0 -1px 0 #bfbfbf;
}
#todo-list li .toggle:checked:after { color: #85ada7; text-shadow: 0 1px 0 #669991; bottom: 1px; position: relative;
}
#todo-list li label { white-space: pre; word-break: break-word; padding: 15px 60px 15px 15px; margin-left: 45px; display: block; line-height: 1.2; -webkit-transition: color 0.4s; transition: color 0.4s;
}
#todo-list li.completed label { color: #a9a9a9; text-decoration: line-through;
}
#todo-list li .destroy { display: none; position: absolute; top: 0; right: 10px; bottom: 0; width: 40px; height: 40px; margin: auto 0; font-size: 22px; color: #a88a8a; -webkit-transition: all 0.2s; transition: all 0.2s;
}
#todo-list li .destroy:hover { text-shadow: 0 0 1px #000, 0 0 10px rgba(199, 107, 107, 0.8); -webkit-transform: scale(1.3); -ms-transform: scale(1.3); transform: scale(1.3);
}
#todo-list li .destroy:after { content: '✖';
}
#todo-list li:hover .destroy { display: block;
}
#todo-list li .edit { display: none;
}
#todo-list li.editing:last-child { margin-bottom: -1px;
}
#footer { color: #777; padding: 0 15px; position: absolute; right: 0; bottom: -31px; left: 0; height: 20px; z-index: 1; text-align: center;
}
#footer:before { content: ''; position: absolute; right: 0; bottom: 31px; left: 0; height: 50px; z-index: -1; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.3), 0 6px 0 -3px rgba(255, 255, 255, 0.8), 0 7px 1px -3px rgba(0, 0, 0, 0.3), 0 43px 0 -6px rgba(255, 255, 255, 0.8), 0 44px 2px -6px rgba(0, 0, 0, 0.2);
}
#todo-count { float: left; text-align: left;
}
#filters { margin: 0; padding: 0; list-style: none; position: absolute; right: 0; left: 0;
}
#filters li { display: inline;
}
#filters li a { color: #83756f; margin: 2px; text-decoration: none;
}
#filters li a.selected { font-weight: bold;
}
#clear-completed { float: right; position: relative; line-height: 20px; text-decoration: none; background: rgba(0, 0, 0, 0.1); font-size: 11px; padding: 0 10px; border-radius: 3px; box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.2);
}
#clear-completed:hover { background: rgba(0, 0, 0, 0.15); box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.3);
}
#info { margin: 65px auto 0; color: #a6a6a6; font-size: 12px; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.7); text-align: center;
}
#info a { color: inherit;
}
/* Hack to remove background from Mobile Safari. Can't use it globally since it destroys checkboxes in Firefox and Opera
*/
@media screen and (-webkit-min-device-pixel-ratio:0) { #toggle-all, #todo-list li .toggle { background: none; } #todo-list li .toggle { height: 40px; } #toggle-all { top: -56px; left: -15px; width: 65px; height: 41px; -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); -webkit-appearance: none; appearance: none; }
}
.hidden { display: none;
}
hr { margin: 20px 0; border: 0; border-top: 1px dashed #C5C5C5; border-bottom: 1px dashed #F7F7F7;
}
.learn a { font-weight: normal; text-decoration: none; color: #b83f45;
}
.learn a:hover { text-decoration: underline; color: #787e7e;
}
.learn h3,
.learn h4,
.learn h5 { margin: 10px 0; font-weight: 500; line-height: 1.2; color: #000;
}
.learn h3 { font-size: 24px;
}
.learn h4 { font-size: 18px;
}
.learn h5 { margin-bottom: 0; font-size: 14px;
}
.learn ul { padding: 0; margin: 0 0 30px 25px;
}
.learn li { line-height: 20px;
}
.learn p { font-size: 15px; font-weight: 300; line-height: 1.3; margin-top: 0; margin-bottom: 0;
}
.quote { border: none; margin: 20px 0 60px 0;
}
.quote p { font-style: italic;
}
.quote p:before { content: '“'; font-size: 50px; opacity: .15; position: absolute; top: -20px; left: 3px;
}
.quote p:after { content: '”'; font-size: 50px; opacity: .15; position: absolute; bottom: -42px; right: 3px;
}
.quote footer { position: absolute; bottom: -40px; right: 0;
}
.quote footer img { border-radius: 3px;
}
.quote footer a { margin-left: 5px; vertical-align: middle;
}
.speech-bubble { position: relative; padding: 10px; background: rgba(0, 0, 0, .04); border-radius: 5px;
}
.speech-bubble:after { content: ''; position: absolute; top: 100%; right: 30px; border: 13px solid transparent; border-top-color: rgba(0, 0, 0, .04);
}
.learn-bar > .learn { position: absolute; width: 272px; top: 8px; left: -300px; padding: 10px; border-radius: 5px; background-color: rgba(255, 255, 255, .6); -webkit-transition-property: left; transition-property: left; -webkit-transition-duration: 500ms; transition-duration: 500ms;
}
@media (min-width: 899px) { .learn-bar { width: auto; margin: 0 0 0 300px; } .learn-bar > .learn { left: 8px; } .learn-bar #todoapp { width: 550px; margin: 130px auto 40px auto; }
}
[ng-cloak] { display: none;
}
TodoMVC using AngularJS - Script Codes JS Codes
/** * The main TodoMVC app module * * @type {angular.Module} */
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: '/' }); });
/** * The main controller for the app. The controller: * - retrieves and persists the model via the todoStorage service * - exposes the model to the template and provides event handlers */
todomvc.controller('TodoCtrl', function TodoCtrl($scope, $routeParams, todoStorage, filterFilter) { var todos = $scope.todos = todoStorage.get(); $scope.newTodo = ''; $scope.editedTodo = null; $scope.$watch('todos', function (newValue, oldValue) { $scope.remainingCount = filterFilter(todos, { completed: false }).length; $scope.completedCount = todos.length - $scope.remainingCount; $scope.allChecked = !$scope.remainingCount; if (newValue !== oldValue) { // This prevents unneeded calls to the local storage todoStorage.put(todos); } }, true); // Monitor the current route for changes and adjust the filter accordingly. $scope.$on('$routeChangeSuccess', function () { var status = $scope.status = $routeParams.status || ''; $scope.statusFilter = (status === 'active') ? { completed: false } : (status === 'completed') ? { completed: true } : null; }); $scope.addTodo = function () { var newTodo = $scope.newTodo.trim(); if (!newTodo.length) { return; } todos.push({ title: newTodo, completed: false }); $scope.newTodo = ''; }; $scope.editTodo = function (todo) { $scope.editedTodo = todo; // Clone the original todo to restore it on demand. $scope.originalTodo = angular.extend({}, todo); }; $scope.doneEditing = function (todo) { $scope.editedTodo = null; todo.title = todo.title.trim(); if (!todo.title) { $scope.removeTodo(todo); } }; $scope.revertEditing = function (todo) { todos[todos.indexOf(todo)] = $scope.originalTodo; $scope.doneEditing($scope.originalTodo); }; $scope.removeTodo = function (todo) { todos.splice(todos.indexOf(todo), 1); }; $scope.clearCompletedTodos = function () { $scope.todos = todos = todos.filter(function (val) { return !val.completed; }); }; $scope.markAll = function (completed) { todos.forEach(function (todo) { todo.completed = !completed; }); };
});
/** * Services that persists and retrieves TODOs from localStorage */
todomvc.factory('todoStorage', function () { var STORAGE_ID = 'todos-angularjs'; return { get: function () { return JSON.parse(localStorage.getItem(STORAGE_ID) || '[]'); }, put: function (todos) { localStorage.setItem(STORAGE_ID, JSON.stringify(todos)); } };
});
/** * Directive that places focus on the element it is applied to when the expression it binds to evaluates to true */
todomvc.directive('todoFocus', function todoFocus($timeout) { return function (scope, elem, attrs) { scope.$watch(attrs.todoFocus, function (newVal) { if (newVal) { $timeout(function () { elem[0].focus(); }, 0, false); } }); };
});
/** * Directive that executes an expression when the element it is applied to gets * an `escape` keydown event. */
todomvc.directive('todoEscape', function () { var ESCAPE_KEY = 27; return function (scope, elem, attrs) { elem.bind('keydown', function (event) { if (event.keyCode === ESCAPE_KEY) { scope.$apply(attrs.todoEscape); } }); };
});
Developer | Victor Yan |
Username | tipsoftheday |
Uploaded | January 05, 2023 |
Rating | 3.5 |
Size | 6,551 Kb |
Views | 6,072 |
Find the perfect freelance services for your business! Fiverr's mission is to change how the world works together. Fiverr connects businesses with freelancers offering digital services in 500+ categories. Find Developer!
Name | Size |
Bootstrap 3 Explained | 3,151 Kb |
Navigation menu using Angular Directive | 2,391 Kb |
Make element focusable using tabindex | 1,593 Kb |
HTML 5 Canvas Example | 2,026 Kb |
Bootstrap 3 button groups | 1,510 Kb |
Tooltip using Bootstrap | 2,452 Kb |
HTML 5 Session Storage Example | 1,825 Kb |
HTML 5 Local Storage Example | 1,912 Kb |
Bootstrap 3 navbar | 1,832 Kb |
Tooltip using jQuery UI | 2,124 Kb |
Jasper is the AI Content Generator that helps you and your team break through creative blocks to create amazing, original content 10X faster. Discover all the ways the Jasper AI Content Platform can help streamline your creative workflows. Start For Free!
Name | Username | Size |
Velocity.js custom stagger | Tommiehansen | 4,805 Kb |
Comparison of Roboto Draft vs Roboto | Jxnblk | 2,880 Kb |
Button Option Group | Honchoman | 1,859 Kb |
Drag n Drop | Martin42 | 2,594 Kb |
Hovers with popups | Zacharyolson | 2,380 Kb |
A Pen by Mike Otis | Mikeotis | 3,185 Kb |
Segments mouse following | Nosir | 2,909 Kb |
CSS Social Media Icon | TychoBlender | 3,871 Kb |
AngularJS Animated Todo List | Ehaase | 2,975 Kb |
Flex Chart | James_zedd | 4,111 Kb |
Surf anonymously, prevent hackers from acquiring your IP address, send anonymous email, and encrypt your Internet connection. High speed, ultra secure, and easy to use. Instant setup. Hide Your IP Now!