2021년 목표설정

이미지
기본적으로 작년에 달성하지 못한 것들을 하려고 생각중인데..코로나가 언제까지 이어질지, 한국이나 북해도는 갈 수 있을지..자격증은 응시 가능할지..여러가지가 불확실하다. 2021년은 무엇보다 정신적인 부분과 경제적인 부분에 중점을 두고 조금 더 치열하게 지내보고 싶다. 일본나이로도 30대 마지막 해, 이제 불혹에 접어드는 나이..복잡하지만 심플하게. 육체적목표 : 트라이에슬론 스탠다드 도전하기 정신적 : 자격증2개 도전 + 자체개발 서비스 론칭 가족적 : 가정의 평화를 유지하기 경제적 : 외식과 유흥비를 줄이고 부수입을 늘려서 결과적으로 저축하기 사회적 : 목표세미나를 포함해서 민단과 개인인맥의 활성화와 교류를 촉진하기

AngularJS TODO List Example and source code

[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>
    <script data-require="jquery@3.1.1" data-semver="3.1.1" src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <link data-require="bootstrap@3.3.6" data-semver="3.3.6" rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
    <script data-require="bootstrap@3.3.6" data-semver="3.3.6" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
    <script data-require="angularjs@1.6.1" data-semver="1.6.1" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.js"></script>
    <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>

댓글

이 블로그의 인기 게시물

[메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우

[C# & LINQ] 랜덤으로 데이터를 한 개 추출하는 방법

[react-native] uuid 생성이 에러가 날 때 대처법