AngularJS 학습 노트 의 TodoMVC 분석

17940 단어
최근 한동안 AngularJS 를 보면 서 시간 을 내 서 정리 해 봤 습 니 다.
홈 페이지 주소:http://angularjs.org/
먼저 몇 개의 강 좌 를 추천 하 다.
1. AngularJS 입문 강 좌 는 비교적 기본 적 이 고 공식 Tutorial 의 번역 입 니 다.
2. 7 단 계 는 AngularJS 초보 부터 전문가 까지 비교적 기초 가 되 어 온라인 음악 재생 사 이 트 를 만 들 었 다.
3. AngularJS 개발 안내 서 는 비교적 전면적 이지 만 번역 이 좀 어렵 고 이해 하기 어렵다 고 생각 합 니 다.
이 튜 토리 얼 을 보고 AngularJS 도 조금 알 것 같 아서 일 을 좀 하려 면 AngularJS 가 쓴 todomvc 를 분석 해 보 세 요.
Todomvc 홈 페이지 주소:http://todomvc.com/
항목 의 디 렉 터 리 는 다음 과 같 습 니 다.
bower_components 에 두 개의 폴 더 가 들 어 있 습 니 다. 그 중에서 angular 폴 더 는 angular. js 파일 과 같은 것 입 니 다. todomvc - comon 폴 더 에 모든 todo 프로젝트 가 통 일 된 css\js (왼쪽 내용 만 생 성 하 는 것 으로 프로젝트 와 무관 합 니 다) 와 그림 을 넣 었 습 니 다.
js 폴 더 는 큰 머리 이 고 그 안에 해당 하 는 controller (컨트롤 러)\directive (명령)\service (서비스) 와 app. js 를 넣 었 습 니 다.
test 폴 더 에 테스트 용 코드 를 넣 었 습 니 다. 분석 하지 않 습 니 다.
index. html 는 프로젝트 의 view 페이지 입 니 다.
일단 app. js 를 볼 게 요.
 
  
/*global angular */
/*jshint unused:false */
'use strict';
/**
 * The main TodoMVC app module
 *
 * @type {angular.Module}
 */
var todomvc = angular.module('todomvc', []);

모듈 todomvc 를 정의 한 것 입 니 다.
서비스 에 있 는 todoStorage. js 를 다시 볼 게 요.
 
  
/*global todomvc */
'use strict';
/**
 * Services that persists and retrieves TODOs from localStorage
 */
todomvc.factory('todoStorage', function () {
    // todos JSON
    var STORAGE_ID = 'todos-angularjs';
    return {
        // localStorage todos, JSON
        get: function () {
            return JSON.parse(localStorage.getItem(STORAGE_ID) || '[]');
        },
        // todos JSON , localStorage
        put: function (todos) {
            localStorage.setItem(STORAGE_ID, JSON.stringify(todos));
        }
    };
});

factory 방법 으로 todoStorage 의 service 방법 을 만 들 었 습 니 다. 이 service 방법의 본질은 두 가지 방법 get 과 put 를 되 돌려 주 는 것 입 니 다. 둘 다 JSON 2 와 HTML 5 의 특성 을 사 용 했 습 니 다.get 은 todos 의 내용 을 localstorage 에서 꺼 내 JSON 으로 해석 하고 put 는 todos 를 JSON 문자열 로 바 꾸 어 localstorage 에 저장 합 니 다.
directives 아래 명령 파일 두 개 를 다시 보 세 요.
todoFocus.js
 
  
/*global todomvc */
'use strict';
/**
 * 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) {
        // todoFocus
        scope.$watch(attrs.todoFocus, function (newVal) {
            if (newVal) {
                $timeout(function () {
                    elem[0].focus();
                }, 0, false);
            }
        });
    };
});

function 의 매개 변 수 를 되 돌려 줍 니 다. elem 은 이 명령 을 포함 하 는 요소 의 배열 입 니 다. attrs 는 요소 의 모든 속성, 속성 명 등 으로 구 성 된 대상 입 니 다.
그 중 에 AngularJS 방법 두 가 지 를 사 용 했 어 요.
$watch (watchExpression, listener, objectEquality) 는 디텍터 리 셋 을 등록 합 니 다. watchExpression 이 변 할 때마다 감청 리 셋 이 실 행 됩 니 다.
$timeout (fn [, delay] [, invokeApply]) timeout 의 값 이 도 달 했 을 때 fn 함 수 를 실행 합 니 다.
todo Focus. js 에서 todo Focus 명령 을 만 들 었 습 니 다.한 요소 가 todo Focus 속성 을 가지 고 있 을 때 이 명령 은 이 요소 의 todo Focus 속성의 값 에 감청 을 추가 합 니 다. todo Focus 속성의 값 이 true 로 바 뀌 면 $timeout (function () {elem [0]. focus ();}, 0, false) 를 실행 합 니 다.이 중 지연 시간 은 0 초 이기 때문에 elem [0]. focus () 를 즉시 실행 합 니 다.
todoEscape.js
 
  
/*global todomvc */
'use strict';
/**
 * 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);
            }
        });
    };
});

todo Escape. js 에서 todo Escape 명령 을 만 들 었 습 니 다.Escape 키 를 눌 렀 을 때 attrs. todo Escape 표현 식 을 실행 합 니 다.
큰 머리 를 보 세 요. controllers 폴 더 에 있 는 todoCtrl. js 입 니 다. 이 파일 은 약간 길 어서 저 는 바로 주석 을 썼 습 니 다.
 
  
/*global todomvc, angular */
'use strict';
/**
 * 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, $location, todoStorage, filterFilter) {
    // localStorage todos
    var todos = $scope.todos = todoStorage.get();

    // todo
    $scope.newTodo = '';
    // todo
    $scope.editedTodo = null;
    // todos
    $scope.$watch('todos', function (newValue, oldValue) {
        // todos
        $scope.remainingCount = filterFilter(todos, { completed: false }).length;
        // todos
        $scope.completedCount = todos.length - $scope.remainingCount;
        // $scope.remainingCount 0 ,$scope.allChecked true
        $scope.allChecked = !$scope.remainingCount;
        // todos , localStorage todos
        if (newValue !== oldValue) { // This prevents unneeded calls to the local storage
            todoStorage.put(todos);
        }
    }, true);
    if ($location.path() === '') {
        // $location.path() , /
        $location.path('/');
    }
    $scope.location = $location;
    // location.path()
    $scope.$watch('location.path()', function (path) {
        //
        // path '/active', { completed: false }
        // path '/completed', { completed: true }
        // , null
        $scope.statusFilter = (path === '/active') ?
            { completed: false } : (path === '/completed') ?
            { completed: true } : null;
    });
    // todo
    $scope.addTodo = function () {
        var newTodo = $scope.newTodo.trim();
        if (!newTodo.length) {
            return;
        }
        // todos todo,completed false
        todos.push({
            title: newTodo,
            completed: false
        });
        //
        $scope.newTodo = '';
    };
    // todo
    $scope.editTodo = function (todo) {
        $scope.editedTodo = todo;
        // Clone the original todo to restore it on demand.
        // todo,
        $scope.originalTodo = angular.extend({}, todo);
    };
    // todo
    $scope.doneEditing = function (todo) {
        //
        $scope.editedTodo = null;
        todo.title = todo.title.trim();
        if (!todo.title) {
            // todo title , todo
            $scope.removeTodo(todo);
        }
    };
    // todo
    $scope.revertEditing = function (todo) {
        todos[todos.indexOf(todo)] = $scope.originalTodo;
        $scope.doneEditing($scope.originalTodo);
    };
    // todo
    $scope.removeTodo = function (todo) {
        todos.splice(todos.indexOf(todo), 1);
    };
    // todos
    $scope.clearCompletedTodos = function () {
        $scope.todos = todos = todos.filter(function (val) {
            return !val.completed;
        });
    };
    // todo (true false)
    $scope.markAll = function (completed) {
        todos.forEach(function (todo) {
            todo.completed = completed;
        });
    };
});


 마지막 으로 index. html 를 보 세 요. 이 파일 은 우리 가 한 단락 한 단락 분석 합 니 다.
 
  


   
       
       
        AngularJS • TodoMVC
       
       
   
   
       

           
           

               
               
               

                       

  •                        

                               
                               
                               

                           

                               
                           

                       

  •                

           

           

                {{remainingCount}}
                   
               

               

                       

  •                         All
                       

  •                    

  •                         Active
                       

  •                    

  •                         Completed
                       

  •                

               
           

       

       

           

Double-click to edit a todo


           

Credits:
                Christoph Burgdorf,
                Eric Bidelman,
                Jacob Mumm and
                Igor Minar
           


           

Part of TodoMVC


       

       
       
       
       
       
       
       
   


우선 맨 아래 에 해당 하 는 JS 를 도입 하 는 것 은 더 말 할 나 위도 없다.
 
  








style [ng - cloak] 을 정의 합 니 다. ng - cloak 속성 을 포함 하면 보이 지 않 습 니 다.
 
  


todo 를 추가 하 는 html 를 보 겠 습 니 다. 바 인 딩 된 model 은 new Todo 입 니 다. submit 방법 은 todoCtrl. js 의 addTodo () 입 니 다. todo 를 추가 하고 Enter 를 누 르 면 제출 이 벤트 를 기본 으로 터치 하면 addTodo () 방법 이 실 행 됩 니 다. todo 를 todos 에 추가 합 니 다.
 
  

   


todos 를 보 여 주 는 html 를 다시 봅 니 다.
 
  

   
   
   

           

  •            

                   
                   
                   

               

                   
               

           

  •    



section 은 ngShow 방법 을 사용 하여 todos 의 길이 에 따라 표시 여 부 를 판단 합 니 다. 게다가 ng - cloak 속성 은 처음에 AngularJS 가 처리 되 지 않 은 페이지 를 표시 하지 않 기 위해 서 입 니 다.새로 고침 을 없 애고 해 볼 수 있 습 니 다.
이 중 id 는 toggle - all 의 checkbox 로 allChecked model 에 연결 되 어 있 으 며, markAll (allChecked) 을 누 르 면 allChecked 의 값 을 입력 하여 모든 todos 를 표시 합 니 다.
ngRepeat 순환 을 사용 하여 li 라벨 을 만 듭 니 다. todo in todos | filter: status Filter track by $index, todos 순환, status Filter 로 걸 러 내 고 $index 로 추적 합 니 다.ngClass 는 두 개의 class 를 연결 하 였 습 니 다. {completed: todo. completed, editing: todo = = edited Todo}, todo. completed 가 true 이면 completed class 를 추가 하고 todo = = edited Todo 이면 editing class 를 추가 합 니 다.class 는 toggle 의 checkbox 를 todo. copleted 에 연결 합 니 다.todo 제목 이 보 여 주 는 label 은 이 벤트 를 더 블 클릭 하여 editTodo (todo) 를 터치 합 니 다. editTodo 는 todo 를 editedTodo 에 부여 한 다음 에 아래 form 의 todo Focus 명령 을 실행 합 니 다. 이때 form 의 input 를 볼 수 있 습 니 다.Esc 를 누 르 면 revert Editing (todo) 을 터치 하고 편집 전 으로 복원 하 며 Enter 를 누 르 거나 초점 을 잃 으 면 done Editing (todo) 을 터치 하여 편집 한 todo 를 저장 합 니 다.class 는 destroy 의 button 에 click 이 벤트 를 연결 하고 removeTodo (todo) 를 누 르 면 이 todo 를 삭제 합 니 다.
마지막 으로 todos 의 통계 정 보 를 보 여 주 는 html
 
  

    {{remainingCount}}
       
   

   

           

  •             All
           

  •        

  •             Active
           

  •        

  •             Completed
           

  •    

   


ng - pluralize 탭 은 remainingCount 개수 가 1 일 때 item left 를 표시 합 니 다. 그렇지 않 으 면 items left 를 표시 합 니 다.
id 가 filers 인 ul 탭 에 location. path () 의 내용 에 따라 태그 가 다른 a 탭 이 선택 되 었 습 니 다.
id 는 clear - completed button 에 클릭 이 벤트 를 추가 하고 clearComplete Todos () 를 터치 하여 완 료 된 todo 를 모두 제거 합 니 다.
오늘 의 필 기 는 여기까지 하 겠 습 니 다. 모두 개인 적 인 소감 입 니 다. 친구 들 이 좋아 하 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기