首頁 > web前端 > js教程 > 主體

AngularJS學習筆記之TodoMVC的分析_AngularJS

WBOY
發布: 2016-05-16 16:13:26
原創
1449 人瀏覽過

最近一段時間一直在看AngularJS,趁著一點時間總結一下。

官網網址:http://angularjs.org/

先推薦幾個教學

1. AngularJS入門教學 比較基礎,是官方Tutorial的翻譯。

2. 七步驟從AngularJS菜鳥到專家 也比較基礎,製作了一個線上音樂播放網站。

3. AngularJS開髮指南 這個教學比較全面,但我覺得翻譯的有些晦澀難懂。

看過這些教學後,覺得AngularJS也懂一點了,就想用它做點事,就分析一下AngularJS寫的todomvc吧。

Todomvc官網網址:http://todomvc.com/

專案的目錄如下:

bower_components裡放了兩個資料夾,其中angular資料夾是用來一如angular.js檔案的,todomvc-common資料夾裡的放入了所有todo專案統一的cssjs(只是用來產生左側內容的,與項目無關)和圖片。

js資料夾是大頭,裡面放了對應的controller(控制器)directive(指令)service(服務)和app.js。

test資料夾裡放的是測試用的程式碼,不分析。

index.html是專案的view頁。

先來看看app.js

複製程式碼 程式碼如下:

/*global angular */
/*jshint unused:false */
'use strict';
/**
 * 主要的 TodoMVC 應用程式模組
 *
 * @type {angular.Module}
 */
var todomvc = angular.module('todomvc', []);

就是定義了一個模組todomvc

再看一下services下的todoStorage.js

複製程式碼 程式碼如下:

/*global todomvc */
'use strict';
/**
 * 持久保存並從 localStorage 擷取 TODO 的服務
 */
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,兩者都是用了JSON2和HTML5的特性。 get將todos的內容從localStorage中取出,並解析成JSON,put將todos轉換成JSON字串,並儲存到localStorage中。

再看一下directives下面的兩個指令檔。

todoFocus.js

複製程式碼 程式碼如下:

/*global todomvc */
'use strict';
/**
 * 當綁定到的表達式計算結果為 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函數。

todoFocus.js建立了todoFocus指令。當一個元素擁有todoFocus屬性時,該指令會為該元素的todoFocus屬性的值添加監聽,如果todoFocus屬性的值改變成true,就會執行$timeout(function () {elem[0].focus(); }, 0, false);其中的延遲時間為0秒,所以會立即執行elem[0].focus()。

todoEscape.js

複製程式碼 程式碼如下:

/*global todomvc */
'use strict';
/**
 * 當應用於的元素取得
時執行表達式的指令  * 一個 `escape` 按鍵事件。
 */
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);
            }
        });
    };
});

todoEscape.js創建了todoEscape指令。當按下Escape鍵時,執行attrs.todoEscape的表達式。

看一下大頭,controllers資料夾中的todoCtrl.js,這個檔案略長,我就直接寫註解了。

複製程式碼 程式碼如下:

/*全域 todomvc,角度 */
'使用嚴格';
/**
 * 應用程式的主控制器。控制器:
 * - 透過 todoStorage 服務擷取並儲存模型
 * - 將模型暴露給模板並提供事件處理程序
 */
todomvc.controller('TodoCtrl', function TodoCtrl($scope, $location, todoStorage, filterFilter) {
    // 從localStorage取得all
    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的新值和舊值不相等時,存入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}}
                       

                   

                   

                         

    •                         全部
                         

    •                    

    •                                      活性
                         

    •                    

    •                                     已完成
                     

                   
                頁腳>
            節>
           
               

    雙擊編輯待辦事項


               

    鳴謝:
                    http://twitter.com/cburgdorf">克里斯托夫布格多夫,
                    http://ericbidelman.com">埃里克 Bidelman,
                    http://jacobmumm.com">雅各穆姆和
                    http://igorminar.com">伊戈爾米納爾
               


               

    http://todomvc.com">TodoMVC

    >
    的部分         頁腳>
           
           
           
           
           
           
           
        身體>
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板