angular入門(mén)

angular簡(jiǎn)介

  • angular是一個(gè)框架,諸多類(lèi)庫(kù)的集合,以數(shù)據(jù)和邏輯為核心;

MVC

  • modal-view-controller 模型-視圖-控制器
  • 模型:服務(wù)端專(zhuān)門(mén)處理后臺(tái)傳入的數(shù)據(jù);一般指操作數(shù)據(jù)庫(kù)
  • 控制器:將服務(wù)端處理好的數(shù)據(jù)傳給前端; 連接模型和視圖的橋梁;
  • 視圖:將內(nèi)容、數(shù)據(jù)呈現(xiàn)給;HTML展示
  • 使用mvc框架,會(huì)更高效,易于管理和高效

AngularJS應(yīng)用

  • 在任意DOM元素上使用一個(gè)屬性 ng-app,就可以定義一個(gè)AngularJS的應(yīng)用;
  • ng-app屬性所有的DOM元素所包含的所有子元素都屬于應(yīng)用的一部分;
  • 引用了angular框架下,會(huì)引入一個(gè)全局對(duì)象,angular;
  • 在此對(duì)象下有若干對(duì)象,其中angular.module()可以實(shí)例化一個(gè)對(duì)象;
  • angular.module('App',[])兩個(gè)參數(shù):
    • 1:模塊化名稱
    • 2:依賴;[]暫時(shí)不依賴任何對(duì)象
  • 控制器App.controller()兩個(gè)參數(shù)
    • 1:名稱
    • 2:依賴;
      • 關(guān)于依賴,依賴的數(shù)組里,最后一個(gè)單元必須是一個(gè)函數(shù)
      • App.controller('DemoCtrl',[’$scope‘,function($scope){}])
    • $scope 就是我們所需要的 M;

angular的內(nèi)置指令

  • ng-show 是通過(guò) display:none 和 display:block來(lái)決定顯示和隱藏的
  • ng-if 如果ng-if='false',那么在HTML中就沒(méi)有了這個(gè)DOM節(jié)點(diǎn)了;
  • ng-class 值得類(lèi)型可以是對(duì)象,并且此對(duì)象的屬性是真是存在的類(lèi)樣式,屬性值決定了此屬性是否應(yīng)用,true為應(yīng)用,false不應(yīng)用 ng-class={box:true,red:true}為應(yīng)用box這個(gè)類(lèi)樣式
  • ng-include = “'aside.html'”;需要將aside.html用''包裹起來(lái)的;
    • 瀏覽器端 JS不能夠讀取本地文件,因?yàn)闉g覽器JS是運(yùn)行在客戶端的,出于安全考慮,是不允許讀取用戶磁盤(pán)文件的;
    • ng-include是通過(guò)ajax發(fā)出請(qǐng)求,得到數(shù)據(jù)的;
  • 表單禁用 disabled,只要屬性存在,不管是什么值,都表示禁用
    • input type='text' disabled 或者disabled=''true/false ;只要存在都是禁用
    • 在angular中,ng-disabled = 'true'表單禁用;ng-disabled = 'false'表單應(yīng)用
  • 無(wú)值屬性:都可以進(jìn)行設(shè)置屬性值;
    • ng-disabled
    • ng-readonly
    • ng-checked
    • ng-selected
  • ng-src 和 ng-href ;如果在HTML中直接寫(xiě)src=《path》,雖然在解析完成后地址會(huì)加載,但是會(huì)先報(bào)錯(cuò);

Angular自定義指令

  • angular是一個(gè)模塊實(shí)例
  • .controller()來(lái)定義一個(gè)模塊
  • .directive()來(lái)自定義屬性;
    <p cls></p>
    //自定義指令結(jié)構(gòu)
    App.directive('cls',function(){
        //return 回來(lái)是一個(gè)對(duì)象或者是函數(shù),通常情況下都是對(duì)象
        return {
            //E : element DOM元素
            //C: class
            //M: mark:注釋
            //A:attribute 屬性
            restrict:"A",
            replace:"true",//模板中的標(biāo)簽會(huì)將HTML中的標(biāo)簽進(jìn)行替換
            template:"<h1>這是通過(guò)自定義指令添加的內(nèi)容</h1>",
        }
    })

AngualrJS 雙向數(shù)據(jù)綁定

  • 通過(guò)表單元素添加 ng-model 屬性;

  • ng-bind

  • 花括號(hào)(使用《》代替)

    • 《》是ng-bind的簡(jiǎn)寫(xiě)
    
         <input type="text" ng-model='name'>//input可以直接獲取module中的$scope.name的值
         <h1 ng-bind='name'></h1>
         <h2>《name》</h2>
    
  • 只有表單元素才可以從視圖向模型傳送數(shù)據(jù)

AngularJS數(shù)據(jù)處理

  • ng-switch = "item" === ng-switch on = "item"
  • 閃爍問(wèn)題處理,可以添加 ng-cloak指令 <h1 ng-cloak>《name》</h1>;
  • angular 的遍歷
        <li ng-repeat='item in lists'>{{item}}</li>
        //或者是
        <li ng-repeat='item in lists'>
            <span ng-bind='item'></span>
        </li>

小知識(shí)點(diǎn)

  • 觸發(fā)臟值檢測(cè) scope.$digest();監(jiān)聽(tīng)視圖中的數(shù)據(jù)改變;ng-click事件內(nèi)部中自動(dòng)封裝了這個(gè)檢測(cè),也可以手動(dòng)添加;
  • form 表單有默認(rèn)的submit事件,通過(guò)回車(chē)就可以觸發(fā);。form中如果有action,那么在submit之后,action也會(huì)重新發(fā)送一次請(qǐng)求,會(huì)刷新頁(yè)面,所以,當(dāng)使用submit提交數(shù)據(jù)時(shí),可以將默認(rèn)的action刪除;
    <form ng-submit='show()'>
        <h1>todos</h1>
        <input class="new-todo" ng-model='msg' placeholder="What needs to be done?" autofocus>
    </form>
    //angularJS通過(guò)ng-model將V與M進(jìn)行綁定;
    //所以input中的value值就等于$scope.msg; 所以實(shí)際上$scope.msg = $('input').val();只不過(guò)這一步是AngularJS內(nèi)部做的;
    //所以`$scope.msg=""`就直接將input的val值置空了;
  • AngularJS 遍歷,獲取當(dāng)前元素的index值
    <ul class="todo-list">
            <li ng-repeat="item in tabs ">//item可以獲取當(dāng)前元素
                <div class="view">
                    <input ng-click="change($index)" class="toggle" type="checkbox"> //$index 代表當(dāng)前元素所對(duì)應(yīng)的index值
                    <label>《item.tab》</label>
                    <button  class="destroy"></button>
                </div>
            </li>
        </ul>
        
  • 在angular中,涉及到通過(guò)判斷而決定某個(gè)樣式顯示或隱藏時(shí),盡量通過(guò) ng-class="{attr:flag}"來(lái)決定,不用再在js中進(jìn)行if判斷了;

作用域

  • 根作用于 ng-app="App"所處的作用域

過(guò)濾器

  • 在AngularJS中使用過(guò)濾器格式化展示數(shù)據(jù),在“《》”中使用"|"來(lái)調(diào)用過(guò)濾器,使用“:”傳遞參數(shù);
  • 價(jià)格過(guò)濾器 《price|currency:'¥':1》;冒號(hào)后面是傳參數(shù),多個(gè)參數(shù)多個(gè)冒號(hào)鏈接,:1表示表劉一個(gè)小數(shù);
  • 時(shí)間過(guò)濾器 《now | date:"yyyy-MM-dd hh:mm:ss"》
  • 控制排序方向 《list | orderBy:"score":"true"》 true為反向排序,false為正向排序,默認(rèn)為false;
  • 常用內(nèi)置過(guò)濾器

依賴注入

  • 采用 ‘注入’ 的方式可以解決開(kāi)發(fā)過(guò)程中的依賴的關(guān)系,成為依賴注入;
  • 一般 注入是通過(guò) ‘參數(shù)’ 的形式實(shí)現(xiàn)的;
  • $http$scope 一樣,也是AngularJS內(nèi)置的功能。可以提供發(fā)送異步請(qǐng)求的功能;

服務(wù)(重點(diǎn))

  • $AngularJS內(nèi)置的服務(wù);ng- AngularJS 內(nèi)置的指令;
  • 常見(jiàn)的內(nèi)置服務(wù):需要在依賴中寫(xiě)入,然后才可以使用
    • $scope
    • $interval
    • $timeout
    • $log
    • $http

$log 服務(wù) 調(diào)試信息的輸出

      $log.error('這是一個(gè)錯(cuò)誤');
      $log.warn('這個(gè)一個(gè)警告');
      $log.log('這是一個(gè)console.log');
      $log.debug('這是一個(gè)調(diào)試');
      $log.info('這是一個(gè)普通內(nèi)容');

$timeout$interval

  • $timeout 服務(wù),延時(shí)顯示數(shù)據(jù),$interval 服務(wù):計(jì)時(shí)器
    App.controller('DemoCtrl',['$timeout','$log','$interval',function ($timeout,$log,$interval) {
       //$timeout是一個(gè)函數(shù)
       //延時(shí)3秒后顯示內(nèi)容;
       $timeout(function () {
           $log.info('我哈哈哈,我等了3秒')
       },3000);

       var i = 0;
       $interval(function () {
           $log.info(i++);
       },1000)
   }])

$http 專(zhuān)門(mén)發(fā)起異步請(qǐng)求

  • 2、在PHP中 $_POST 是專(zhuān)門(mén)接收 formData格式數(shù)據(jù)的,即“Content-Type:application/x-www-form-urlencoded”; 但是不能接收 Content-Type:application/json;
  • 3、當(dāng)headers為“Content-Type:application/x-www-form-urlencoded”時(shí),上傳的data格式為 data:"name=itcast&age=11";
  • 4、當(dāng)headers為“Content-Type:application/json”時(shí),傳遞的參數(shù)格式為:data:{"name":"itcast","name":18};

AngularJS $http總結(jié)

  1. $http發(fā)送請(qǐng)求的方式有3種:method:“get”/"post"/'jsonp';
  2. 參數(shù)的傳遞方式為:params:
get方式請(qǐng)求
  • "get"方式發(fā)送請(qǐng)求時(shí),正常發(fā)送;參數(shù)以params:{name:'lisi',age:18}發(fā)送;
    • 不管以什么方式傳遞參數(shù),內(nèi)部都會(huì)轉(zhuǎn)換成 ?name=lisi&age=18的形式
    • 在PHP中將傳入的參數(shù)以json對(duì)象的形式輸出
        $http({
          url:'./example.php',
          method:'get',
          params:{name:'lisi',age:18},
          
      }).success(function (data) {
          console.log(data);
      })
    //在PHP中代碼:
    $name = $_GET['name'];
    $age = $_GET['age'];
    $array = ['name'=>$name,'age'=>$age];
    //var_dump($array);
    //將傳遞的參數(shù)放到數(shù)組中,并將數(shù)組轉(zhuǎn)換成json對(duì)象格式進(jìn)行輸出;
    echo json_encode($array);
    //結(jié)果為:{name: "lisi", age: "18"}
post方式請(qǐng)求
  • “post”請(qǐng)求,需要注意兩點(diǎn)
    1. 設(shè)置請(qǐng)求頭:headers:“Content-Type:application/x-www-form-urlencoded”;

    2. 參數(shù)以data傳遞form data,data:“name=lisi&age=17”;請(qǐng)求頭與參數(shù)必須保持一致;

           //post請(qǐng)求
           $http({
               url: './example.php',
               method: 'post',
               data: 'name=lisi&age=17',
               headers: {
                   'Content-Type': 'application/x-www-form-urlencoded'
               }
           }).success(function (data) {
               console.log(data);
           })
      
JSONP 的原理

前端傳遞一個(gè)實(shí)現(xiàn)定義好的函數(shù)名,給服務(wù)端,然后服務(wù)端接收這個(gè)函數(shù)名并拼湊一個(gè)“()”,并返回,前端就接收到了 這個(gè)函數(shù)的調(diào)用;
在jQuery中,我們不寫(xiě)callback的明細(xì),ajax會(huì)自動(dòng)幫我們生成一個(gè),jQuery+序列號(hào)+時(shí)間戳等;但是在angularJS中,他們有幫我們封裝,所以必須手動(dòng)加上;

    $http({
            url:'./example.php',
            method:'jsonp',
            params:{
                //callback必須用'JSON_CALLBACK'進(jìn)行占位,后端返回回調(diào)函數(shù):angular.callbacks._0(lisi);這個(gè)回調(diào)函數(shù)的結(jié)果就是success時(shí)的data數(shù)據(jù);
                callback:'JSON_CALLBACK',
                name:'lisi',
                age:17
            }
        }).success(function (data) {
            console.log(data);
        }) 

自定義服務(wù),$service$factory

  • App.controller(); 內(nèi)置控制器
  • App.directive(); 內(nèi)置指令
  • App.filter(); 內(nèi)置過(guò)濾器
  • App.factory(); 內(nèi)置服務(wù)
  • App.service(); 內(nèi)置服務(wù)
  • App.config(); 配置塊
  • App.run(); 運(yùn)行塊

配置塊和運(yùn)行塊

  • App.config():一個(gè)參數(shù),為數(shù)組;[];App.config([]);
    App.config(['$logProvider','$filterProvider',function ($logProvider,$filterProvider) {
    //通過(guò)$logProvider對(duì)$log進(jìn)行配置;
    $logProvider.debugEnabled(false);
    $filterProvider.register('capitalize',function () {
       return function (input) {
           return (input[0].toUpperCase() + input.slice(1));
       }
    })
    }]);
    //這樣在配置好之后,在HTML中就可以直接使用‘capitalize’服務(wù)了
    <p ng-controller='DemoCtrl'> 《name | capitalize》</p>

運(yùn)行塊

  • $rootScope: AngularJS的根作用域,可定于全局變量
     App.run(['$rootScope',function ($rootScope) {
            $rootScope.name = '順治';
        }])
        //這個(gè)name在此文件中的任何一個(gè)控制器中都可以使用;

路由

  • 路由是URL地址與程序的映射關(guān)系;通過(guò)調(diào)整地址的變化,可以‘調(diào)用或執(zhí)行’ 某一具體的程序;
  • SPA:single page application 單頁(yè)面展示所有功能;
  • 多頁(yè)面最明顯的一個(gè)缺點(diǎn)就是每次更新頁(yè)面都要進(jìn)行刷新,不能得到很好的用戶體驗(yàn);
  • AngularJS的路由是建立在單頁(yè)面的基礎(chǔ)之上的;
  • onhashchange:檢測(cè)地址欄中地址的變化,綁在window上的
  • PHP中:file_get_contents('./views/'.$hash.'.html');獲取文件中的內(nèi)容
  • 錨鏈接就是點(diǎn)斷的路由,就是地址與程序的映射關(guān)系;

路由的配置

  • 路由經(jīng)過(guò)設(shè)置才能使用
  • 模塊需要依賴路由 var Music = angular.module('Music',['ngRoute']);
     <nav>
     //錨點(diǎn)中有參數(shù)的時(shí)候,不會(huì)影響到路由;?
        <a href="#!/login?name=小明">登錄</a> //地址必須寫(xiě)成  #!/的形式
        <a href="#!/register">注冊(cè)</a>
    </nav>
        <!-- ng-view 是一個(gè)占位符-->
    <div ng-view></div>
    
    var App = angular.module('App',['ngRoute']);
    //路由是需要配置才能使用;
    App.config(['$routeProvider',function ($routeProvider) {
        //兩個(gè)參數(shù)path 和 route
        //第一個(gè)參數(shù):路由
        //第二個(gè)參數(shù)是路由的配置
        $routeProvider.when('/register',{
            //template:"<h1>首頁(yè)</h1>",簡(jiǎn)單的內(nèi)容
            templateUrl:'./views/register.html' //可以引入U(xiǎn)RL地址
            //為當(dāng)前視圖文件分配控制器;
            controller:'RegisterCtrl',
        }).when('/login',{
            //template:"<h1>登錄</h1>",
            templateUrl:'./views/login.html'
        }).otherwise({
            //如果都不符合,可以設(shè)置默認(rèn)值
            redirectTo:'/register'
        })
    }])
    
    App.controller('RegisterCtrl',['$scope',function ($scope) {
        $scope.title = '注冊(cè)';
    }])
    
    //然后在register.html頁(yè)面中就可以直接進(jìn)行數(shù)據(jù)綁定 <h1>《title》</h1>;
  • 可以使用路由,也就是說(shuō)開(kāi)發(fā)者可以根據(jù)地址的變化執(zhí)行不同的業(yè)務(wù)邏輯;路由需要 配置 后才能被使用;

  • 使用when方法監(jiān)聽(tīng)地址的變化,然后處理相應(yīng)的邏輯;

  • 參數(shù)傳遞可以有兩種方式,一種方式是通過(guò)地址傳參:

    • 地址傳參:其格式為?key1=val&key2=val2;.when('/login?name=lisi&age=17')

    • 通過(guò)路由傳參: 路由/:參數(shù)名

    • ?。?!注意:地址的格式(/login/:name/:pass)必須與路由的格式(#!/login/小明/12345)完全保持一致,一一對(duì)應(yīng);

        <a href="#!/login/小明/12345">登錄</a>
        .when('/login/:name/:pass',{
        
            //template:"<h1>登錄</h1>",
            templateUrl:'./views/login.html'
        })
    
    • 獲取路由中傳遞的參數(shù) var parameter = $routeParams;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,087評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,521評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,493評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,207評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,603評(píng)論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,813評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,364評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,110評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,305評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,532評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,953評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,209評(píng)論 1 291
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,033評(píng)論 3 396
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,268評(píng)論 2 375

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

  • AngularJS是什么?AngularJs(后面就簡(jiǎn)稱ng了)是一個(gè)用于設(shè)計(jì)動(dòng)態(tài)web應(yīng)用的結(jié)構(gòu)框架。首先,它是...
    200813閱讀 1,629評(píng)論 0 3
  • Angular 簡(jiǎn)介 什么是 AngularJS 一款非常優(yōu)秀的前端高級(jí) JS 框架 最早由 Misko Heve...
    J_L_L閱讀 615評(píng)論 0 5
  • ng-model 指令ng-model 指令 綁定 HTML 元素 到應(yīng)用程序數(shù)據(jù)。ng-model 指令也可以:...
    壬萬(wàn)er閱讀 887評(píng)論 0 2
  • 簡(jiǎn)介# AngularJS 是一個(gè)為動(dòng)態(tài)WEB應(yīng)用設(shè)計(jì)的結(jié)構(gòu)框架,提供給大家一種新的開(kāi)發(fā)應(yīng)用方式,這種方式可以讓你...
    Simple_habits閱讀 582評(píng)論 0 9
  • 我的大學(xué)同學(xué)-呂珺。鄂旗人民醫(yī)院使其家破人亡,痛失愛(ài)妻,妻子叫苗昊媛,2017年2月22日13時(shí)02分,入鄂...
    Brena閱讀 574評(píng)論 0 0