基本的AngularJS指令及控制器

AngularJs模塊

概念:AngularJs將相關(guān)的代碼封裝起來,通過某種命名方式進行調(diào)用
一個AngularJs模塊包含兩部分:

  • 模塊可以定義自己的控制器,服務,工廠類(factory)以及指令暖混。這些代碼或者函數(shù)在整個模塊中都是可以訪問到的
  • 模塊也可以依賴于其他模塊,這些依賴在模塊示例化時就已經(jīng)定義完畢庆揪。這就意味著AngularJs可以通過命名找到相應的模塊境析,并確保該模塊中所有的函數(shù),控制器馁痴,服務等在當期模塊內(nèi)都是可用的

模塊的功能不僅僅是用于包含相關(guān)JavaScript代碼的容器谊娇,AngularJs也用它來啟動應用。我們可以通過將模塊名稱傳給ng-app指令來告訴AngularJs應用的入口在哪里
定義模塊的方式,該模塊的名稱為notesApp:
angular.module('notesApp',[]);

  • AngularJs中的module函數(shù)的第一個參數(shù)代表了模塊名稱济欢。在例子中模塊名是notesApp
  • 第二個參數(shù)是一個數(shù)組赠堵,表示該模塊所依賴的模塊名稱列表。請注意例子中的第二個參數(shù)是一個空數(shù)組法褥,這意味著我們想要創(chuàng)建的notesApp模塊不需要依賴其他模塊

加載定義在其他源文件中的模塊茫叭,那么angular.module函數(shù)只需要第一個參數(shù):
`angular.module('notesApp');
這行代碼將會通知AngularJs去查找名為notesApp的模塊,并確保我們能夠在當前文件中使用半等,增加或者修改該模塊揍愁。我們可以通過這個方法在不同的源文件中引用同一模塊并進行擴展。
兩個常見的錯誤:

  • 想定義一個模塊卻忘記傳入第二個參數(shù)杀饵。這會導致AngularJs去查找該模塊而不是定義該模塊莽囤,AngularJs會給出“找不到模塊”(No module found)錯誤
  • 想從另一個文件中加載某個模塊并修改它,但包含該模塊的文件卻沒有預先加載切距。請確保所有需要的文件在引用之前都已經(jīng)被正確地加載到HTML中

ng-app指令可以接受一個可選參數(shù)朽缎,該參數(shù)表示啟動時需要加載的模塊名稱

<html ng-app="notesApp">
    <head>
        <title>Hello AngularJs</title>
    </head>
    <body>
        Hello{{1+1}}nd time AngularJs
        <script type="text/javascript" src="https://ajax.gooogleapis.com/ajax/libs/angularjs/1.2.19/angular.js"></script>
        <script type="text/javascript">
            angular.module('notesApp',[]);
        </script>
    </body>
</html>

上例中定義了一個模塊(注意angular.moudle函數(shù)中第二個參數(shù)是個空數(shù)組),然后讓AngularJs通過ng-app指令來啟動該模塊谜悟。

創(chuàng)建自定義控制器

控制器包攬了AngularJs中的雜活话肖,通過JavaScript函數(shù)來執(zhí)行或觸發(fā)與UI相關(guān)的任務。
AngularJs控制器的主要職責有:

  • 從服務器獲取所需數(shù)據(jù)以生成頁面UI
  • 決定哪些數(shù)據(jù)將會被呈現(xiàn)給用戶
  • 一些與頁面相關(guān)的邏輯葡幸,比如如何顯示元素最筒,UI中的哪些部分是可見的,它們的風格又是什么樣的
  • 用戶交互蔚叨,比如響應用戶單擊事件以及驗證文本輸入框中的值
    AngularJs控制器通常和某個HTML視圖是直接關(guān)聯(lián)的床蜘。控制器不會孤零零地游離于UI之外而不被其中任何一個所引用(如果有的話缅叠,這些業(yè)務邏輯更應該用服務來實現(xiàn))悄泥。
    模型中數(shù)據(jù)驅(qū)動著整個應用,視圖用于和用戶交互肤粱,而控制器則是兩者之間的門戶弹囚。
    讓我們再來看看如何為noteApp模塊創(chuàng)建控制器:
<html ng-app="notesApp">
    <head>
        <title>Hello AngularJs</title>
    </head>
    <body ng-controller="MainCtrl">
        Hello{{1+1}}nd time AngularJs
        <script type="text/javascript" src="https://ajax.gooogleapis.com/ajax/libs/angularjs/1.2.19/angular.js"></script>
        <script type="text/javascript">
            angular.module('notesApp',[])
                .controller('MainCtrl',[function(){
                    //此處為與控制器相關(guān)的代碼
                    console.log('MainCtrl has been created');
                }]);
        </script>
    </body>
</html>

在這里,我們用controller函數(shù)定義了一個控制器领曼,它對于AngularJs中的某個模塊是可見的鸥鹉。

  • controller函數(shù)中的第一個參數(shù)表示該控制器的名稱,在上例中就是“MainCtrl”庶骄。
  • 第二個參數(shù)定義了控制器的真正的行為毁渗,做什么和怎么做

細節(jié)注意:controller函數(shù)中定義的匿名函數(shù)包含在一個數(shù)組內(nèi)。也就是說单刁,controller函數(shù)的第一個參數(shù)表示控制器名稱(MainCtrl)灸异,而第二個參數(shù)則是一個數(shù)組。
這個數(shù)組以字符串格式包含了控制器所依賴的模塊名稱,數(shù)組中最后那個參數(shù)是真正的控制函數(shù)肺樟。本例中檐春,我們沒有任何依賴關(guān)系,因此數(shù)組中只包含控制函數(shù)了么伯。該函數(shù)包含了所有與控制器相關(guān)的代碼

指令ng-controller:該指令可以讓AngularJs通過名稱創(chuàng)建出控制器實例疟暖,然后將它關(guān)聯(lián)到DOM元素上。
通過顯示“Hello World”,代碼如下:

<html ng-app="notesApp">
    <head>
        <title>Notes App</title>
    </head>
    <body ng-controller="MainCtrl as ctrl">
        {{ctrl.helloMsg}}AngularJs.
        <br/>
        {{ctrl.goodbyeMsg}}AngularJs
        <script type="text/javascript" src="https://ajax.gooogleapis.com/ajax/libs/angularjs/1.2.19/angular.js"></script>
        <script type="text/javascript">
            angular.module('notesApp',[])
                .controller('MainCtrl',[function(){
                    //此處為與控制器相關(guān)的代碼
                    this.helloMsg = 'Hello';
                    var goodbyeMsg = 'Goodbye';
                }]);
        </script>
    </body>
</html>

上例結(jié)果中我們只看到了“Hello AngularJs.”田柔,“Goodbye”并沒有顯示在UI中
任何定義在控制器實例上(通過控制器中的this關(guān)鍵字而不是像googbyeMsg變量那樣通過var關(guān)鍵字來定義)的變量都是可以訪問的俐巴,也能在HTML中呈現(xiàn)給用戶
任何用戶想看的信息或者HTML中需要用到的數(shù)據(jù),都必須通過this關(guān)鍵字將它定義成控制器實例的成員變量硬爆。反過來說欣舵,如果不想HTML直接控制某個變量,就不能把它定義成控制器的成員變量缀磕,這種情況下倒是應該像例子中的goodbyeMsg那樣定義成控制器作用域中的局部變量

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邻遏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子虐骑,更是在濱河造成了極大的恐慌,老刑警劉巖赎线,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件廷没,死亡現(xiàn)場離奇詭異,居然都是意外死亡垂寥,警方通過查閱死者的電腦和手機颠黎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滞项,“玉大人狭归,你說我怎么就攤上這事∥呐校” “怎么了过椎?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長戏仓。 經(jīng)常有香客問我疚宇,道長,這世上最難降的妖魔是什么赏殃? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任敷待,我火速辦了婚禮,結(jié)果婚禮上仁热,老公的妹妹穿的比我還像新娘榜揖。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布举哟。 她就那樣靜靜地躺著思劳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炎滞。 梳的紋絲不亂的頭發(fā)上敢艰,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音册赛,去河邊找鬼钠导。 笑死,一個胖子當著我的面吹牛森瘪,可吹牛的內(nèi)容都是我干的牡属。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼扼睬,長吁一口氣:“原來是場噩夢啊……” “哼逮栅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窗宇,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤措伐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后军俊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侥加,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年粪躬,在試婚紗的時候發(fā)現(xiàn)自己被綠了担败。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡镰官,死狀恐怖提前,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泳唠,我是刑警寧澤狈网,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站警检,受9級特大地震影響孙援,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扇雕,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一拓售、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镶奉,春花似錦础淤、人聲如沸崭放。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽币砂。三九已至,卻和暖如春玻侥,著一層夾襖步出監(jiān)牢的瞬間决摧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工凑兰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掌桩,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓姑食,卻偏偏與公主長得像波岛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子音半,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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