[app.js] // 모듈 정의
angular.module('todo',[]);
|
[controllers.js] // 비지니스 로직 정의
angular.module('todo').controller('TodoCtrl',function($scope, todoStorage)
{
$scope.todos = todoStorage.get();
$scope.remove = function(todo)
{
todoStorage.remove(todo);
};
$scope.add = function(newTodoTitle)
{
todoStorage.add(newTodoTitle);
$scope.newTodoTitle="";
};
$scope.update = function()
{
todoStorage.update();
};
});
|
[directive.js] // 사용자 정의 디렉티브
angular.module('todo').directive('todoTitle',function(){
return {
template:'<h1>Todo Title</h1>'
}
});
angular.module('todo').directive('todoItem',function(){
return {
templateUrl:'todoItem.tpl.html'
}
});
angular.module('todo').directive('todoFilters',function(){
return{
templateUrl:'todoFilters.tpl.html'
}
});
angular.module('todo').directive('todoForm',function(){
return{
templateUrl:'todoForm.tpl.html'
}
});
|
[index.html] // View
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="style.css" />
<script src="app.js"></script>
<script src="services.js"></script>
<script src="directive.js"></script>
<script src="controllers.js"></script>
</head>
<body ng-app="todo" ng-controller="TodoCtrl">
<div class="container">
<!--<h1>Todo list</h1>-->
<todo-title></todo-title>
<todo-form></todo-form>
<!--<pre>{{todoForm | json}}</pre>-->
<p></p>
<div align="center">
<todo-filters></todo-filters>
</div>
<div class="col-lg-6" ng-repeat="todo in todos | filter:statusFilter">
<todo-item></todo-item>
</div>
<!-- /.col-lg-6 -->
</div>
</body>
</html>
|
[services.js] // Data의 추가, 삭제, 업데이트 등을 서비스로 구현
angular.module('todo').factory('todoStorage',function(){
var TODO_DATA = 'TODO_DATA';
var storage =
{
// todo...
todos : [],
_saveToLocalStorage: function (data)
{
localStorage.setItem(TODO_DATA,JSON.stringify(data));
},
_getFromLocalStorage: function()
{
return JSON.parse(localStorage.getItem(TODO_DATA))||[];
},
get: function()
{
//storage.todos = storage._getFromLocalStorage();
angular.copy(storage._getFromLocalStorage(),storage.todos);
return storage.todos;
},
remove: function(todo)
{
// find todo index in todos
var idx = storage.todos.findIndex(function (item)
{
return item.id === todo.id;
});
// remove from todos
if (idx > -1)
{
storage.todos.splice(idx,1);
storage._saveToLocalStorage(storage.todos);
}
},
add: function(newTodoTitle){
// create new todo
var newTodo=
{
title:newTodoTitle,
completed:false,
createdAt:Date.now()
};
// push into todos
storage.todos.push(newTodo);
storage._saveToLocalStorage(storage.todos);
},
update: function()
{
storage._saveToLocalStorage(storage.todos);
}
}
return storage;
});
|
[style.css] // 입력폼을 값에 따라서 디자인 변경시킬 때 사용
/* Styles go here */
.input-group .ng-valid.ng-dirty
{
border: solid 1px green;
}
.input-group .ng-invalid.ng-dirty
{
border: solid 1px red;
}
|
[todoFilters.tpl.html] // 사용자 정의 디렉티브와 연동되는 템플릿 html
<button class="btn btn-primary" ng-click="statusFilter={completed:true}">Completed</button>
<button class="btn btn-primary" ng-click="statusFilter={completed:false}">Active</button>
<button class="btn btn-primary" ng-click="statusFilter={}">All</button>
|
[todoForm.tpl.html]
<form name="todoForm" ng-submit="add(newTodoTitle)">
<div class="input-group">
<input type="text" class="form-control" ng-model="newTodoTitle" placeholder="Input new Todo element" autofocus="" minlength="3" />
<span class="input-group-btn">
<button class="btn btn-success" type="submit">Add</button>
</span>
</div>
<div ng-show="todoForm.$dirty && todoForm.$invalid">
<div class="alert alert-warning" role="alert">Required least 3 and more Char.. </div>
</div>
</form>
|
[todoItem.tpl.html]
<date>
{{todo.createdAt | date:'yyyy-MM-dd HH:mm:ss'}}
</date>
<div class="input-group">
<span class="input-group-addon">
<input type="checkbox" ng-model="todo.completed" ng-click="update()">
</span>
<input type="text" class="form-control" ng-model="todo.title" ng-blur="update()">
<span class="input-group-btn">
<button class="btn btn-danger" type="button" ng-click="remove(todo)">Delete</button>
</span>
</div>
|
댓글
댓글 쓰기