亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

AngularJs 與Jquery的對比分析,超詳細!

2024-04-27 15:05:22
字體:
來源:轉載
供稿:網友

閑來無事,在網上發現了一篇對比AngularJs和Jquery的文章.恰好最近自己也在研究AngularJs.特此收藏.需要的朋友可以參考.

原問題:假如我熟悉利用jQuery去開發客戶端應用,那么我怎么上手angularjs,能否描述下所需要的模式轉變,下面這些問題能夠幫助你給出一個回答:

1.在設計客戶端web應用的時候有什么區別,最大的區別是什么?

2.我應該停止使用哪些技術,同時又使用哪些技術作為替代?

3.是否存在服務端需要考慮的東西或者說一些限制呢?

回答:

1.不要首先設計好你的頁面,然后再通過DOM操作去修改它

在jQuery中,你首先設計了一個page,然后再去動態修改它的內容,這是因為jQuery被設計用來進行擴展并在這個前提下大幅度地增加和修改內容,但是在angularjs中,你必須在心中先設計好你的架構,

從一開始,你就要摒棄“我擁有一個DOM元素并且想讓它去做某件事”,代之為“我需要完成什么任務,然后接著設計你的應用,最后再去設計你的視圖view層”。

2.不要使用angularjs去擴展jQuery

相應地,不要存在說讓jQuery去干某些事情,然后在此基礎上添加angularjs的功能讓它去管理model以及controller的想法。所以我一般不推薦AngularJS開發新手同時使用jQuery,至少在他們還沒有適應AngularJS的開發模式之前不會去推薦這樣做,但是當你真正開始適應angularjs 的方式之后,你會發覺這是一件很誘人的事情。

我曾經看到過很多開發者采用將150到200行代碼的jQuery插件利用angularjs的回調以及$apply方法封裝起來,這種方式使得代碼看起來極其復雜,但是實際上他們讓這些插件跑起來了!問題在于,在大部分情況下jQuery插件能夠用angularjs進行重寫,并且可能只會使用很少量的代碼,同時這種重寫使得代碼很直觀且易于理解,這顯然好過于將jQuery代碼直接做封裝。

所以最后說,當你遇見問題的時候,首先要以angularjs的思維進行思考,如果找不到解決方案,可以求助于社區,如果說沒有人能夠給出一個簡單的方案,那么才考慮使用jQuery,不要讓jQuery成為你的拐杖,否則你永遠掌握不了AngularJS。

3.要以架構為中心進行思考

首先你要知道單頁應用屬于web應用,它們不是傳統的多網頁網站,所以我們要同時作為一個服務端和客戶端開發者的思維進行思考,我們需要思考如何將我們的應用分為獨立的,可擴展的以及可測試的部分。

那么接下來我們如何采用AngularJS思維去工作呢,以下是一些將其與jQuery對比之后的基本準則:

以下是某個應用的視圖層:

在jQuery中,我們動態地去修改這個視圖,我們使用ul去定義一個dropdown menu

復制代碼代碼如下:<ul class="main-menu">    <li class="active">        <a href="#/home">Home</a>    </li>    <li>        <a href="#/menu1">Menu 1</a>        <ul>            <li><a href="#/sm1">Submenu 1</a></li>            <li><a href="#/sm2">Submenu 2</a></li>            <li><a href="#/sm3">Submenu 3</a></li>        </ul>    </li>    <li>        <a href="#/home">Menu 2</a>    </li></ul>

 

在jQuery中,我們采用如下邏輯使用這個dropdownMenu

復制代碼代碼如下:$('.main-menu').dropdownMenu();

讓我們回頭看看這個view,你會發現它的功能并不是很直白,對于小型應用來講,這樣是可以的,但是對于大型應用來講,這種方式會讓人費解并且難以維護;

 

在angularjs中,這個視圖實際上是一項基于視圖的功能,我們可以這樣來定義ul

 

復制代碼代碼如下:<ul class="main-menu" dropdown-menu>    ...</ul>

 

這兩種方式實際上做了同樣的事情,但是在AngularJS方式下任何人看到這個視圖模板就知道接下來要干什么。無論何時當一個新成員加入開發團隊之后他都能夠看到這里并發現這里有一個叫做dropdownMenu的指令去操作view,他不需要去猜想正確的答案或者審查其他的代碼,這個視圖就直接告訴我們它要做什么,相比于jQuery,它更為簡潔。

常常有些AngularJS新手問這樣的問題:我怎么才能找到某個確切類型的所有link并在此基礎上添加一個directive,但是當我們回答了“你不應該這樣去做,你這是一種半jQuery半angularjs的想法”時,他們會覺得很吃驚。

問題在于他們試圖在AngularJS背景下用jQuery去做某件事,這通常不是一種好的方式,在指令之外你不需要去做任何dom操作,而指令是直接內添加在視圖上的,所以意圖已經很明顯了。記住,不要先設計好之后再去修改,而是先有架構然后在這個框架下再去設計。

數據綁定

這是到目前為止AngularJS最令人矚目的特性了,在數據綁定方面它舍棄了對DOM的操作方式,而這一切都是由AngularJS來自動更新視圖,你不必寫操作dom的代碼,在jQuery中,我們常常按照以下方式響應事件并修改視圖:

 

復制代碼代碼如下:$.Ajax({  url: '/myEndpoint.json',  success: function ( data, status ) {    $('ul#log').append('<li>Data Received!</li>');  }});

 

相對于這樣一個視圖

 

復制代碼代碼如下:<ul class="messages" id="log"></ul>

 

除了混雜的問題之外,我們還存在我之前提到的如何表明自己意圖的問題。但是更為重要的是,我們必須人工手動去引用并更新這個DOM節點,如果我們想刪除其中一條,那么必須以編程方式去操作那個DOM元素,那么在這種情況下我們怎么去測試DOM節點之外的邏輯呢,亦或者我們想改變展示方式呢?

以上代碼顯得凌亂又脆弱,但是在AngularJS中,我們可以這樣做:

復制代碼代碼如下:$http( '/myEndpoint.json' ).then( function ( response ) {    $scope.log.push( { msg: 'Data Received!' } );});

 

我們的視圖應該像下面這樣

 

復制代碼代碼如下:<ul class="messages">    <li ng-repeat="entry in log">{{ entry.msg }}</li></ul>

在那種情況下,我們的視圖也可以這樣

 

 

復制代碼代碼如下:<div class="messages">    <div class="alert" ng-repeat="entry in log">        {{ entry.msg }}    </div></div>

 

現在我們不使用ul,而是使用Bootstrap的彈出框,但是我們不用修改controller中的代碼,更為重要的是,不管是數據如何修改,視圖層也會自動隨之發生變化,非常簡潔!

盡管我這里不會做演示,但是你需要知道數據綁定是雙向的,你可以編輯數據通過添加指令<input ng-model="entry.msg" />,此外還有很多其他的令人興奮的地方。

區別model層

在jQuery中,DOM類似于一種model,但是在AngularJS中,我們擁有不同于jQuery中的model層以便我們可以以任何我們想要的方式去管理它,它是完全獨立于視圖之外的。這種方式是有助于我們進行數據綁定并且可以保持對分離的關注,而且可以具備更好的可測試性。

關注點分離

以上所講都和這個總體的話題相關:讓你關注分離,你的視圖層顯示記錄,你的model層代表數據,你還有個服務層用來執行這些可復用的任務。你使用directive來執行dom操作并擴展你的視圖,并將它和controller連接起來,這也就是我在其他方面提到的有關于增強可測試性的原因。

依賴注入

幫助我們解決關注點分離的是依賴注入(DI),如果你是一個服務端開發者(java或者php),你可能已經很熟悉這個概念了,但是如果你是從事客戶端開發的,你會覺得這個概念可能有些多余和純屬追求時髦,但是實際上不是這樣。

從廣義的角度講,DI意味著你可以自由地聲明組件然后從這些組件中進行實例化,這是理所當然的。你不必知道加載順序,文件位置等諸如此類的事情,這種魔力不是能夠立即看到,但是我會給出一個例子:測試。

我們說在應用中,我們需要一個依賴于應用狀態和本地存儲的服務用來通過一個rest API來執行服務端存儲,當我們測試我們的controller時,我們不必和服務端進行通信,畢竟只是在測試controller而已。我們僅添加一個與我們最初組件相同的mock服務,注入器能夠確保我們的controller獲得一個虛擬的服務,controller自身不必也不需要了解這種差異。

那么說說測試吧。

4.以測試驅動的開發

這部分是一個架構的第三部分,但是他是很重要的,以至于我需要將它放在最重要的位置。

在我們所有見過的,用過的以及寫過的jQuery插件中,有多少具有一套測試組件呢?其實并不多,這是因為jQuery在測試上不易控制,但是AngularJS卻與此不同。

在jQuery中,測試的唯一方法是使用一個demo頁去創建一個獨立組件來使得我們的測試可以執行dom操作。我們接下來我們必須開發一個獨立的組件然后將它集成到我們的應用中來,這是多不方便啊!在很多情況下,當我們使用jQuery開發實際上是做了很多重復開發而不是以測試驅動的開發,這又能怪我們嗎?

但是在AngularJS中我們可以關注分離點,所以我們可以做一些測試驅動的開發。例如,我們有一個directive用來說明在menu中我們的當前路徑,我們可以在視圖中這樣聲明:

復制代碼代碼如下:<a href="/hello" when-active>Hello</a>

 

好了,現在我們可以寫一個測試用來測試這個不存在的指令when-active了

復制代碼代碼如下:it( 'should add "active" when the route changes', inject(function() {    var elm = $compile( '<a href="/hello" when-active>Hello</a>' )( $scope );     $location.path('/not-matching');    expect( elm.hasClass('active') ).toBeFalsey();     $location.path( '/hello' );    expect( elm.hasClass('active') ).toBeTruthy();}));

 

我們直接run測試用例,你會發現是失敗的,這時候需要創建這個指令,如下:

 

復制代碼代碼如下:.directive( 'whenActive', function ( $location ) {    return {        scope: true,        link: function ( scope, element, attrs ) {            scope.$on( '$routeChangeSuccess', function () {                if ( $location.path() == element.attr( 'href' ) ) {                    element.addClass( 'active' );                }                else {                    element.removeClass( 'active' );                }            });        }    };});

 

再次run這個測試用例,你會發現通過了并且菜單如請求的樣子顯示,我們的開發是兼有反復性和可測試性,非常酷吧!

5.從概念上講,指令不是打包的jQuery

你常常聽說,dom操作只能在指令中,這是必須的,你必須嚴肅對待。

讓我們深入討論,

某些指令僅僅是裝飾我們的視圖(例如ngClass),因此有時候直接操作dom是可以的,但是當一個指令類似于一個小物件并且擁有自己的模板,那么它應該當做一個分離的關注點,這就是說,它的模板需要和link中的執行邏輯以及其他controller函數分離開。

AngularJS擁有一整套的工具可以是這種分離更簡單,使用ngClass指令,我們可以動態地更新class,使用ngBind我們可以進行雙向數據綁定,使用ngShow和ngHide 我們

可以采用編程的形式顯示和隱藏一個元素,也包括我們自己寫的很多指令。換句話說,我們可以不用Dom操作而完成所有工作,dom操作越少,指令越容易測試,越容易指定他們的style屬性,就越容易在將來改變他們,那么他們就越容易復用和分發。

我看過很多AngularJS新手使用指令封裝一大串 jQuery代碼,換句話說,既然我不能在controller里面進行dom操作,那么我可以將他放在指令中,雖然這相對于直接操作dom好很多,但是任然是錯誤的。

看看我們在上面的記錄,即使我們將其放在一個指令中,我們任然需要以Angular的方式去操作它,這種方式不執行dom操作!在很多時候dom操作是需要的,但是這種情況比你想的要少得多。當我們需要做dom操作的時候先問問自己這里是否必須這樣做,這才是一種更好的方式。

下面是一個簡單的例子用來表明我常常見到的一種模式,我們需要I一個可切換的button:

復制代碼代碼如下:.directive( 'myDirective', function () {    return {        template: '<a class="btn">Toggle me!</a>',        link: function ( scope, element, attrs ) {            var on = false;             $(element).click( function () {                on = !on;                $(element).toggleClass('active', on);            });        }    };});

 

在以上例子中存在以下錯誤:

1.首先,jQuery是不必要的,這里的工作完全不需要jQuery!

2.第二,即使我們已經在頁面中引入了jquery,但是我們沒有理由去使用它,我們可以使用angular.element而我們的組件也能夠運行,即使這個項目中沒有引入jQuery。

3.第三,假設jquery是需要的在我們的指令中,我們可以使用jqLite去進行替代,只要引入jQuery即可,所以我們不必使用$而是使用angular.element;

4.第四,和第三點聯系很緊密,jqLite元素不必使用$包裹起來,element元素傳遞到link函數中已經是一個jQuery對象了;

5.第五,我們之前已經說過,為什么不將我們的模板和邏輯混合起來呢?

以上指令可以按照如下方式來重寫,即使在最復雜的情況下看起來也如此簡單。

復制代碼代碼如下:.directive( 'myDirective', function () {    return {        scope: true,        template: '<a class="btn" ng-class="{active: on}" ng-click="toggle()">Toggle me!</a>',        link: function ( scope, element, attrs ) {            scope.on = false;             scope.toggle = function () {                scope.on = !scope.on;            };        }    };});

 

模板元素是在 template屬性中,你可以很容易替換掉它的style,而邏輯根本不用發生變化,達到了完全復用!

還有其他的好處,比如測試起來很簡單,不管模板里面是什么,指令API都不會發生改變,所以重構它很簡單。你可以隨意多次改變你的模板而不用改變指令,無論你怎么改變,你的測試總能通過!

所以說指令不是一堆jQuery代碼的集合,比如函數等,而是HTML代碼的擴展,如果HTML代碼不能實現你需要的功能,你可以寫一個指令去實現它,然后像使用HTML那樣去使用它。

以另外一種方式講,AngularJS如果不做額外的事情,想想我們怎么能夠使用ngClick,ngClass指令呢?

可以說AngularJs與Jquery的優勢乃至設計思路各有不同,按照我的理解.前者是先搭好房屋,再等人入駐.而后者是,需要入駐的人,帶著磚瓦自己來修一棟樓.至于哪一種更方便更適合你,因人而異了.

你的眼界 不止于此
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人免费观看49www在线观看| 国产精品美女无圣光视频| 亚洲第一国产精品| 亚洲国产精品久久精品怡红院| 亚洲三级 欧美三级| 亚洲激情 国产| www.精品av.com| 色妞色视频一区二区三区四区| 亚洲欧美日韩久久久久久| 亚洲国产小视频| 亚洲成年人在线| 亚洲深夜福利网站| 精品久久久91| 欧美中文在线视频| 91福利视频在线观看| 国产精品视频地址| 日韩视频欧美视频| 欧美国产视频一区二区| 国产精品久久久精品| 欧美在线视频观看免费网站| 国产精品入口夜色视频大尺度| 日韩一区二区欧美| 伊人久久男人天堂| 精品久久国产精品| 在线亚洲男人天堂| 久久精品国产清自在天天线| 97香蕉超级碰碰久久免费软件| 久久久精品中文字幕| 欧美精品激情在线| 欧美日韩性视频在线| 最近2019年好看中文字幕视频| 精品久久香蕉国产线看观看亚洲| 久久91亚洲精品中文字幕奶水| 少妇高潮久久77777| 91在线直播亚洲| 伦理中文字幕亚洲| 国产亚洲精品久久久久久牛牛| 国产精品视频自拍| 亚洲国产美女久久久久| 成人精品aaaa网站| 国产精品高潮呻吟久久av野狼| www.欧美精品一二三区| 精品五月天久久| 91精品国产99| 亚洲国产精品va在线看黑人| 国产精品入口免费视频一| 国产精品极品尤物在线观看| 好吊成人免视频| 日本人成精品视频在线| 久久综合九色九九| 欧美大荫蒂xxx| 中文字幕亚洲欧美日韩高清| 欧美重口另类videos人妖| 亚洲国产精品成人va在线观看| 亚洲免费一级电影| 黑人巨大精品欧美一区二区| 欧美激情亚洲另类| 另类少妇人与禽zozz0性伦| 欧美日韩国产综合视频在线观看中文| 国产日本欧美一区| 欧美激情性做爰免费视频| 最近2019中文字幕一页二页| 国产精品一区二区女厕厕| 岛国av一区二区| x99av成人免费| 国产成人精品久久| 国产经典一区二区| 久久影院模特热| 91久久久久久久久久久| 亚洲国产高潮在线观看| 亚洲乱码国产乱码精品精| 国内精品久久久久| 亚洲一级片在线看| 精品国产91久久久| 亚洲人成网站777色婷婷| 2018中文字幕一区二区三区| 午夜精品福利电影| 日韩免费电影在线观看| 亚洲片国产一区一级在线观看| 午夜精品一区二区三区在线播放| 国产精品青草久久久久福利99| 日韩在线播放视频| 日本三级久久久| 在线观看精品国产视频| 国产精品久久久久久久久久久久久| 日本精品一区二区三区在线| 国产一区二区动漫| 91久久精品美女| 久久精品中文字幕一区| 国产成人久久精品| 国产精品久久久久秋霞鲁丝| 欧美一级视频一区二区| 国产久一一精品| 中文字幕一区电影| 精品久久香蕉国产线看观看亚洲| 伊人久久精品视频| 亚洲91av视频| 97超碰国产精品女人人人爽| 51视频国产精品一区二区| 日韩激情在线视频| 日本最新高清不卡中文字幕| 欧美成年人网站| 91国语精品自产拍在线观看性色| 国产成人一区二区| 97人人模人人爽人人喊中文字| 欧美大奶子在线| 日韩美女主播视频| 成人免费淫片aa视频免费| 亚洲图片欧美午夜| 日本一区二区在线播放| 精品亚洲一区二区三区| 国产亚洲一区二区在线| 亚洲护士老师的毛茸茸最新章节| 热re91久久精品国99热蜜臀| 亚洲高清在线观看| 一区二区三区无码高清视频| 国产成人精品亚洲精品| 国产精品视频一区二区三区四| 国产脚交av在线一区二区| 全球成人中文在线| 日本精品性网站在线观看| 日韩综合视频在线观看| 欧美国产日韩视频| 久久久中精品2020中文| 国产一区二区三区在线视频| 成人疯狂猛交xxx| 亚洲免费伊人电影在线观看av| 久久久久久久久久国产| 97视频免费在线观看| 日韩一级裸体免费视频| 国产欧美在线观看| 日韩中文字幕不卡视频| 2019中文字幕在线观看| 欧美精品一本久久男人的天堂| 国产精品久久久久久久久久免费| 欧美精品福利视频| 国产精品美乳在线观看| 成人亚洲欧美一区二区三区| 人妖精品videosex性欧美| 国产美女精彩久久| 91成人天堂久久成人| 91精品久久久久久久久久入口| 欧美电影在线观看高清| 久久久久久香蕉网| 色妞色视频一区二区三区四区| 欧美老肥婆性猛交视频| 在线精品国产成人综合| 午夜精品一区二区三区在线| 隔壁老王国产在线精品| 91精品久久久久久久久| 欧美影院成年免费版| 久久久久久免费精品| 久久综合九色九九| 欧美国产亚洲精品久久久8v| 日韩中文在线中文网在线观看| 欧美激情网友自拍| 2019中文字幕全在线观看| 亚洲精品影视在线观看| 色综久久综合桃花网| 久久九九精品99国产精品| 51精品国产黑色丝袜高跟鞋| 久久久久久综合网天天| 一区三区二区视频| 国产精品一区av|