AngularJS 簡介

簡介

AngularJS 是什么

AngularJS 是一個結(jié)構(gòu)框架用來時間動態(tài)web應(yīng)用。他讓你使用html作為模板預(yù)覽售葡,
并且可以擴展html的語法,簡介而清晰的表達應(yīng)用組件。
AngularJS 的數(shù)據(jù)綁定和依賴注入谆构,相對其他書寫方式虾攻,減少了大量代碼铡买。
并且AngularJS 是運行在瀏覽器中的,是他成為服務(wù)端技術(shù)理想的搭檔霎箍。

動態(tài)應(yīng)用程序和靜態(tài)文檔之間的不匹配經(jīng)常被解決:

  • 一個庫 - 編寫web應(yīng)用有用的工具集奇钞,你的代碼會在適合的時候調(diào)用庫中的方法,如:jQuery
  • 框架 - web應(yīng)用的一個特殊實現(xiàn)漂坏,你的代碼填充細節(jié)景埃,框架掌控全局,在需要應(yīng)用處理的時候主動調(diào)用你的代碼顶别,如:durandal,ember谷徙。

Angular選擇了其他方式,它較少應(yīng)用創(chuàng)建新的html元素和html文檔之間的阻力驯绎。Angular教授瀏覽器一種新的語法叫做指令完慧,如:

  • 數(shù)據(jù)綁定,如{{}}
  • dom結(jié)構(gòu)控制剩失,如復制屈尼,顯示,綁定
  • 支持表單和表單驗證
  • 為dom 元素附加新的行為拴孤,如DOM 事件綁定脾歧。
  • 將HTML組合成可重用的組件。

基本概念

Concept Description
Template 附加標記的HTML
Directives 自定義屬性和元素擴展HTML
Model 用戶在視圖中顯示的數(shù)據(jù)演熟,以及用戶交互的數(shù)據(jù).
Scope 模型存儲的上下文鞭执,以便控制器、指令和表達式可以訪問它.
Expressions 從范圍訪問變量和函數(shù)
Compiler 解析模板實例化指令和表達式
Filter 格式化表達式的值以顯示給用戶.
View 用戶所看到的(DOM)
Data Binding 在模型和視圖之間同步數(shù)據(jù)
Controller 視圖背后的業(yè)務(wù)邏輯
Dependency Injection Creates and wires objects and functions
Injector 依賴注入容器
Module 一個應(yīng)用程序,包括控制器兄纺、服務(wù)免猾、濾波器的不同部分的容器,指令配置器
Service 與視圖無關(guān)的可重用業(yè)務(wù)邏輯

教程

實例請參見參考資料中的【AngularJS 教程】囤热,把這個教程從頭到尾看一遍就對AngularJS 有了大致的了解猎提,例子很詳細,本文不再贅述旁蔼。

實踐

通用 service

服務(wù)替代對象是連接在一起的使用依賴注入(DI)锨苏。您可以使用服務(wù)在您的應(yīng)用程序中組織和共享代碼.。

服務(wù)的特點是:

  • 延遲實例化 – 角只實例化一個服務(wù)申請時棺聊,部分取決于它伞租。
  • 單例 – 每個組件依賴于一個服務(wù)引用的服務(wù)廠產(chǎn)生的單實例。

下面我舉一個項目中實際的例子限佩。

實例1

通用分頁組件葵诈,當我們開發(fā)項目的時候,分頁功能可能是最常用的功能了祟同。
我們分解分頁所需要的功能如下:

  • 顯示分頁信息
  • 調(diào)用分頁邏輯方法
  • 分頁查詢邏輯實現(xiàn)
  • 數(shù)據(jù)顯示

顯示分頁信息和調(diào)用分頁邏輯方法毋庸置疑是分頁組件提供的
分頁邏輯和數(shù)據(jù)顯示需要根據(jù)具體的業(yè)務(wù)實現(xiàn)作喘。

區(qū)分出邏輯關(guān)系,抽象分頁插件就有了思路晕城。
我的思路是分頁插件要支持分頁信息顯示泞坦,并且可以出發(fā)具體業(yè)務(wù)的查詢方法,還要及時的顯示查詢后的分頁數(shù)據(jù)砖顷,保證分頁顯示的正確贰锁。我的實現(xiàn)如下:

/**
 * 分頁模塊
 *
 * Usage:
 * 導入本文件,并在初始化app時引用 ‘common.paging’ 模塊
 * eg.
 * angular.module('material.module', ['common.paging'])
 *
 * 在需要分頁的標簽下應(yīng)用標簽
 * eg.
 * <paging-modal pageInfo="pageInfo"  style="margin-right:0px;"></paging-modal>
 *
 * 在app初始化的時候創(chuàng)建分頁信息對象滤蝠,必須在 onChange 方法中添加查詢方法豌熄。
 * eg.
 * $scope.pageInfo = {
 *    pageNum: 1, //current page number
 *    pageSize: 20, //per page show data
 *    maxShowPage: 10, //分頁標簽數(shù)量顯示
 *    pages: 0,//total page numbers
 *    total: 0,//the total numbers of data
 *    //pageArray: [10],//size equals to maxShowPage
 *    // when user switch page, this module will call this method
 *    // it`s the main module`s duty to to detail search work.
 *    onChange: function (currentPageNum) {
 *        $scope.pageInfo.pageNum = currentPageNum
 *      //do something for seatch
 *    }
 * };
 *
 *
 *
 */
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
angular.module('common.paging', [])
    .directive('pagingModal', [function () {
        return {
            restrict: 'EA', //E表示element, A表示attribute,C表示class,M表示commnent,即注釋
            scope: {
                title: '@', //@讀屬性值物咳,=雙向綁定锣险,&用戶函數(shù)
                conf: '='
            },
            replace: true,
            //template: '<div>{{myVal}}</div>',
            templateUrl: ctx + '/view/common/paging',
            //controller: 'pagingInit',
            link: function ($scope) {

                //=====================================================================================
                //init page info
                $scope.pageInfo = $scope.$parent.pageInfo
                //$scope.pageInfo.preArray = [];
                //$scope.pageInfo.nextArray = [];
                //=====================================================================================

                // 變更當前頁
                $scope.toPage = function (pageNum) {
                    //$scope.pageInfo.pageNum=pageNum;
                    $scope.pageInfo.onChange(pageNum)
                };
                $scope.firstPage = function () {
                    //$scope.pageInfo.pageNum=1;
                    $scope.pageInfo.onChange(1)
                };
                $scope.endPage = function () {
                    //$scope.pageInfo.pageNum=$scope.pageInfo.pages;
                    $scope.pageInfo.onChange($scope.pageInfo.pages)
                };

                //scope.conf.pagesLength = parseInt(scope.conf.pagesLength) ? parseInt(scope.conf.pagesLength) : 9;
            }//DOM操作
        };
    }])
    .service('pagingService', function () {

        this.reloadPageInfo = function (oldPageInfo, newPageInfo) {
            oldPageInfo.pageNum = newPageInfo.pageNum
            oldPageInfo.total = newPageInfo.total
            oldPageInfo.pages = newPageInfo.pages

            //cal
            var show = oldPageInfo.maxShowPage;
            oldPageInfo.preArray = [];
            oldPageInfo.nextArray = [];
            for (var i = 0; i < 5; i++) {
                if (oldPageInfo.pageNum - i - 1 == 0) {
                    break;
                }
                oldPageInfo.preArray[i] = oldPageInfo.pageNum - i - 1;
            }
            show--
            for (var i = 0; i < show - oldPageInfo.preArray.length; i++) {
                if (oldPageInfo.pageNum + i + 1 > oldPageInfo.pages) {
                    break
                }
                oldPageInfo.nextArray[i] = oldPageInfo.pageNum + i + 1;
            }
            //oldPageInfo.pageSize = newPageInfo.pageSize
        };

        this.cleanPageInfo = function () {
            pageInfo.total=0
        };
    });


頁面顯示如下:

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="UTF-8" %>

<div class="page">

    <div ng-show="pageInfo.total > 0">

        <a href="javascript:;" ng-click="toPage(item)" ng-repeat="item in pageInfo.preArray|orderBy : order ">{{item}} </a>
        {{pageInfo.pageNum}}
        <a href="javascript:;" ng-click="toPage(item)" ng-repeat="item in pageInfo.nextArray">{{item}} </a>
        ,
        共{{ pageInfo.pages }}頁,
        每頁顯示<strong style="color:#428BCA;">{{ pageInfo.pageSize }}</strong>條數(shù)據(jù)/
        結(jié)果數(shù)<strong style="color:#428BCA;">{{ pageInfo.total }}</strong>
    </div>

    <div ng-show="pageInfo.total == 0">暫無數(shù)據(jù)</div>
</div>

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末所森,一起剝皮案震驚了整個濱河市囱持,隨后出現(xiàn)的幾起案子夯接,更是在濱河造成了極大的恐慌焕济,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盔几,死亡現(xiàn)場離奇詭異晴弃,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門上鞠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來际邻,“玉大人,你說我怎么就攤上這事芍阎∈涝” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵谴咸,是天一觀的道長轮听。 經(jīng)常有香客問我,道長岭佳,這世上最難降的妖魔是什么血巍? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮珊随,結(jié)果婚禮上述寡,老公的妹妹穿的比我還像新娘。我一直安慰自己叶洞,他們只是感情好鲫凶,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衩辟,像睡著了一般掀序。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惭婿,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天不恭,我揣著相機與錄音,去河邊找鬼财饥。 笑死换吧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的钥星。 我是一名探鬼主播沾瓦,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谦炒!你這毒婦竟也來了贯莺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宁改,失蹤者是張志新(化名)和其女友劉穎缕探,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體还蹲,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡爹耗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年耙考,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潭兽。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡倦始,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出山卦,到底是詐尸還是另有隱情鞋邑,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布账蓉,位于F島的核電站炫狱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏剔猿。R本人自食惡果不足惜视译,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望归敬。 院中可真熱鬧酷含,春花似錦、人聲如沸汪茧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舱污。三九已至呀舔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扩灯,已是汗流浹背媚赖。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留珠插,地道東北人惧磺。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像捻撑,于是被迫代替她去往敵國和親磨隘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容