国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
AngularJS:何時(shí)應(yīng)該使用Directive、Controller、Service?

AngularJS:何時(shí)應(yīng)該使用Directive、Controller、Service?

(這篇文章你們一定要看,尤其初學(xué)的人,好嗎親?)

大漠窮秋

AngularJS是一款非常強(qiáng)大的前端MVC框架。同時(shí),它也引入了相當(dāng)多的概念,這些概念我們可能不是太熟悉。(譯者注:老外真謙虛,我大天朝的碼農(nóng)對(duì)這些概念那是相當(dāng)熟悉?。。┻@些概念有:

  • Directive(指令)
  • Controller(控制器)
  • Service (服務(wù))

下面我們逐個(gè)來看這些概念,研究一下為什么它們會(huì)像當(dāng)初設(shè)計(jì)的那樣強(qiáng)大,同時(shí)研究一下為什么我們要以那樣的方式去使用它們。我們從Service開始。

SERVICES(服務(wù))

如果你已經(jīng)使用過AngularJS,你可能已經(jīng)遇到過Service這個(gè)概念了,簡而言之,Service就是【單例對(duì)象】在AngluarJS中的一個(gè)別名。這些小東西(指單例對(duì)象)會(huì)被經(jīng)常傳來傳去,保證你每次訪問到的都是同一個(gè)實(shí)例,這一點(diǎn)和工廠模式不同。基于這種思想,單例對(duì)象讓我們可以實(shí)現(xiàn)一些相當(dāng)酷的功能,它可以讓很多controller和directive訪問內(nèi)部的數(shù)值。在#angularjs 頻道(譯者注:指的是原作者自己的博客頻道)里面這也是非常常見的問題之一,那就是在應(yīng)用中的不同代碼塊之間如何共享數(shù)據(jù)?我們來看這個(gè)問題。

我們首先來創(chuàng)建一個(gè)module(模塊),本文中的所有代碼都會(huì)用到這個(gè)module。

var module = angular.module( "my.new.module", [] );

下一步,我們來創(chuàng)建一個(gè)新的service(服務(wù))。假設(shè)我們上面的這個(gè)module是用來管理圖書的。所以,這里我們來創(chuàng)建一個(gè)Book service,然后把一個(gè)JSON對(duì)象數(shù)組添加到這個(gè)serice中,這些對(duì)象代表很多book數(shù)據(jù)。

 module.service( 'Book', [ '$rootScope', function( $rootScope ) {      var service = {      books: [        { title: "Magician", author: "Raymond E. Feist" },        { title: "The Hobbit", author: "J.R.R Tolkien" }      ],      addBook: function ( book ) {        service.books.push( book );        $rootScope.$broadcast( 'books.update' );      }   }   return service;}]);

這是一個(gè)非常簡單的service(有時(shí)候這樣就夠你用了)。我們這里正在做的事情就是在管理一個(gè)book 數(shù)組,同時(shí)還帶有一個(gè)addBook方法,在有需要的時(shí)候可以添加更多書籍。addBook方法還會(huì)在application上廣播一個(gè)事件,告訴所有正在使用我們的service的人,數(shù)組已經(jīng)被更新了,從而讓它們自己也做一些刷新操作?,F(xiàn)在,我們要做的就是把這個(gè)service傳遞給各種controller、directive、filter,或者其它任何需要它的東西---然后它們就可以訪問service中的這些方法和屬性了。好,我們來動(dòng)手。

 var ctrl = [ '$scope', 'Book', function( scope, Book ) {   scope.$on( 'books.update', function( event ) {     scope.books = Book.books;   });    scope.books = Book.books; }]; module.controller( "books.list", ctrl );

同樣非常簡單。我們上面所做的就是為我們的module創(chuàng)建了一個(gè)新的controller。在創(chuàng)建的時(shí)候把$scope provdier和我們自己的Book service傳遞給了它。能明白我們在干嘛嗎?我們把前面創(chuàng)建的Book service中的books數(shù)組賦給了controller內(nèi)部的局部scope對(duì)象。很酷,對(duì)吧?

好,這里的核心問題是什么呢?我們節(jié)省了一些時(shí)間,并且在controller上創(chuàng)建了一個(gè)數(shù)組。對(duì)---我們確實(shí)這樣做了。這樣做確實(shí)也為我們節(jié)約了一點(diǎn)時(shí)間---但是如果我們要在其它地方處理這些書籍信息應(yīng)該怎么辦呢?通過scope來維護(hù)數(shù)據(jù)是非常粗暴的一種方式。由于其它c(diǎn)ontroller、directive、model的影響,scope很容易就會(huì)崩潰或者變臟。它很快就會(huì)變成一團(tuán)亂麻。通過一種集中的途徑(在這里就是service)來管理所有書籍?dāng)?shù)據(jù),然后通過某種方式來請求修改它,這樣不僅僅會(huì)更加清晰---同時(shí)當(dāng)應(yīng)用的體積不斷增大的時(shí)候也更加容易管理。最后,它還可以讓你的代碼保持模塊化(這也是Angular很擅長的一件事情)。一旦你在其它項(xiàng)目中需要用到這個(gè)service,你沒有必要在scope、controller、filter等等東西里面到處去查找相關(guān)的代碼,因?yàn)樗袞|西都在service里面!

好。那么我們什么時(shí)候應(yīng)該使用service呢?答案是:無論何時(shí),當(dāng)我們需要在不同的域中共享數(shù)據(jù)的時(shí)候。另外,多虧了Angular的依賴注入系統(tǒng),實(shí)現(xiàn)這一點(diǎn)是很容易并且很清晰的。

CONTROLLERS(控制器)

我們再來看控制器!除非你曾經(jīng)使用過前端MVC,否則從服務(wù)端MVC的思維模式轉(zhuǎn)向客戶端MVC的思維模式就如同一次腦筋急轉(zhuǎn)彎。為什么會(huì)這樣呢?這是因?yàn)椋m然在前端開發(fā)中controller實(shí)現(xiàn)了非常類似的功能,但是它同時(shí)還會(huì)實(shí)現(xiàn)一些與服務(wù)端controller非常不同的功能。在Angular中,controller自身并不會(huì)處理"request",除非它是用來處理路由(route)的(很多人把這種方式叫做創(chuàng)建route controller---路由控制器),更明確地說,尤其是你的應(yīng)用里面那些作為界面的一部分的controller,它們只會(huì)管理非常小的一段代碼。

controller應(yīng)該純粹地用來把service、依賴關(guān)系、以及其它對(duì)象串聯(lián)到一起,然后通過scope把它們關(guān)聯(lián)到view上。如果在你的視圖里面需要處理復(fù)雜的業(yè)務(wù)邏輯,那么把它們放到controller里面也是一個(gè)非常不錯(cuò)的選擇。回到我們前面的這個(gè)books例子,我實(shí)際上并沒有什么東西需要添加到controller里面。

但是Kirk(譯者注:指本文原作者),如果我要add一本書籍應(yīng)該怎么辦呢?我應(yīng)該在controller上面新增一個(gè)方法來處理這件事情嗎?不,原因在下面解釋。因?yàn)樗荄OM交互/操作的一部分。所以請把它放到directive(指令)里面。怎么做呢?很高興你能問出這個(gè)問題。

DIRECTIVES(指令)

到目前為止,在我們所編寫的大量AngularJS應(yīng)用中,應(yīng)用中最主要的復(fù)雜部分都在directive(指令)中。有一個(gè)強(qiáng)大的工具可以用來操作和修改DOM,它也是我們這里需要討論的內(nèi)容。我們來提供一個(gè)按鈕,用戶通過它可以向service里面添加一本圖書,以這一功能來結(jié)束此文。

一個(gè)常見的反模式(按照本人愚見)是在controller里面添加DOM交互代碼。Angular對(duì)directive的定義是一段代碼片段,你可以用它來操作DOM,但是我覺得directive也是進(jìn)行用戶交互的很好選擇。我們來擴(kuò)展前面的例子,為用戶提供一個(gè)按鈕,通過這個(gè)按鈕可以向service里面添加一本書籍。

module.directive( "addBookButton", [ 'Book', function( Book ) {    return {        restrict: "A",            link: function( scope, element, attrs ) {            element.bind( "click", function() {                Book.addBook( { title: "Star Wars", author: "George Lucas" } );            });        }    }}]);

很簡單的東西。我們創(chuàng)建了一個(gè)指令,它的核心目的是簡單地向books列表中添加一本書籍,books已經(jīng)注冊在了我們的Book服務(wù)中。我們來把這個(gè)指令應(yīng)用到我們的視圖中。

<button add-book-button>Add book</button>

如你所見,我們僅僅把指令當(dāng)作一個(gè)元素屬性來使用。每次點(diǎn)擊這個(gè)按鈕的時(shí)候,它都會(huì)把《Star Wars》(《星球大戰(zhàn)》)這本書添加到我們的Book service中去。簡單、輕松、模塊化---并且易復(fù)用。好了,我們?yōu)槭裁床恢苯釉诳刂破魃厦嫣砑右粋€(gè)addBook之類的方法呢,比如說就像下面這樣:

 $scope.addBook = function() {     Book.addBook( { title: "Star Wars", author: "George Lucas" } ); };

這樣我們也能獲得同樣的結(jié)果,對(duì)吧?是的,確實(shí)如此---但是這樣做會(huì)帶來一個(gè)重大的問題。一旦我需要在其它地方添加書籍,我必須拷貝這份代碼(非常un-DRY!)(譯者注:DRY---Dont Repeat Yourself,貌似是Ruby所倡導(dǎo)的一個(gè)重要的編碼原則。),或者進(jìn)行重構(gòu)(重構(gòu)本身并不是什么不好的的事情)。通過直接構(gòu)建一個(gè)指令的方式,我們以后就沒有必要擔(dān)心這種事情了---同時(shí)下次再需要實(shí)現(xiàn)相同功能的時(shí)候完全不需要花任何時(shí)間。通過構(gòu)建指令的方式來進(jìn)行DOM交互和修改,隨著業(yè)務(wù)需求的不斷介入,我們就可以立即騰出手來處理復(fù)雜性不斷增加的應(yīng)用了。這是相當(dāng)不錯(cuò)的一件事情,因?yàn)樗WC了我們可以更少地和自己的實(shí)現(xiàn)打架,并且可以一直編寫DRYer code。

Angular的模塊依賴哲學(xué)無疑讓它成為了一款非同凡響的框架。它讓我們能夠以這樣一種方式來編寫我們的前端代碼:我們不會(huì)干翻自己,也不會(huì)干翻框架---這可能是它最強(qiáng)大的力量。

希望我已經(jīng)充分說明了你應(yīng)該在何時(shí)何地使用這幾個(gè)Angular概念,從而能夠更好地編寫你自己的代碼。

原文鏈接:

http://kirkbushell.me/when-to-use-directives-controllers-or-services-in-angular/

其它相關(guān)內(nèi)容:

1、《AngularJS》一書已經(jīng)由電子工業(yè)出版社出版

http://damoqiongqiu.iteye.com/blog/1965167

2、《AngularJS》5個(gè)實(shí)例詳解Directive(指令)機(jī)制

http://damoqiongqiu.iteye.com/blog/1917971

3、AngularJS表單基礎(chǔ)

http://damoqiongqiu.iteye.com/blog/1920191

4、AngularJS Form 進(jìn)階:遠(yuǎn)程校驗(yàn)和自定義輸入項(xiàng)

http://damoqiongqiu.iteye.com/blog/1920993

5、AngularJS:在Windows上安裝Yeoman

http://damoqiongqiu.iteye.com/blog/1885371

6、對(duì)比Angular/jQueryUI/Extjs:沒有一個(gè)框架是萬能的

http://damoqiongqiu.iteye.com/blog/1922004

7、使用JsTestDriver實(shí)現(xiàn)JavaScript單元測試

http://damoqiongqiu.iteye.com/blog/1924415

8、JavaScript單元測試系列二:將Jasmine集成到JsTestDriver

http://damoqiongqiu.iteye.com/blog/1925974

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
跟我學(xué)AngularJs:Service、Factory、Provider依賴注入使用與區(qū)別
StackOverFlow精彩問答賞析:有jQuery背景的開發(fā)者如何建立起AngularJS的思維模式?
深究AngularJS——自定義服務(wù)詳解(factory、service、provider)
再談angularJS數(shù)據(jù)綁定機(jī)制及背后原理
AngularJS 簡介 | 菜鳥教程
AngularJS1:directive和controller如何通信
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服