AngularJS--雙向數據綁定

 

Google AngularJS是一個JS框架,適用於以數據操做爲主的SPA應用。全部的操做都是以數據爲出發點。四大特性:php

  (1)MVC模型html

Model:即業務數據   $scope.xx  $rootScope.xx面試

View:即業務數據的呈現   HTML + ngXxx瀏覽器

Controller:負責操做業務數據   .controller('', function(){})服務器

  (2)雙向數據綁定app

方向1:Model綁定到View,只要Model變View隨着變框架

方向2:View(表單控件)綁定到Model,只要View變Model隨着變異步

  (3)依賴注入ide

  (4)模塊化設計模塊化

 

面試題:AngularJS的最大的不足/應用時須要特別關注的地方?

原生ES/JS/DOM只有特定HTML元素的特定事件的監聽機制,沒有監聽數據/對象/值改變的機制。

 

$interval和window.setInterval()的區別?

$interval修改的任何Model數據,底層會當即遍歷一遍$digest隊列;

setInterval()即便修改了Model數據,也不會遍歷$digest隊列;

$interval(function(){ $scope.count++; }, 1000)

等價於

setInterval(function(){ $scope.count++;  $digetst()/$apply(); }, 1000)

 

 

2.依賴注入

 Dependency:若某個函數調用時須要其它的對象做爲形參,就此函數依賴於形參對象。

 function Driver( car ){          //司機依賴於一個car對象

       car.start();

car.run();

car.stop();

 }

 如何解決依賴關係:

  (1)主動建立方式

var c1 = new Car(); //主動建立依賴對象

var d1 = new Driver( c1 );  //傳遞依賴對象

  (2)被動注入(Injection)方式

module.controller('控制器', function($scope, $interval){})

    Angular中的ngController指令在實例化控制器對象時,會根據指定的形參名,建立出控制器所依賴的對象,並注入給控制器對象——依賴注入(Dependency Injection,DI)現象。

  注意:

(1)Angular在建立控制器對象時,會根據形參列表中的每一個形參的名稱來建立依賴的對象,故控制器聲明函數不能聲明Angular沒法識別的形參名——Angular只提供了這一種依賴注入方式——根據形參名來注入依賴的對象!

      (2)若項目JS文件使用了相似yuicompressor等壓縮程序,默認會把函數的形參名精簡爲一個字母的形式,會致使Angular的依賴注入失敗!解決辦法:

module.controller('控制器名', [

'$scope',

'$interval',

'$http',

function(aaa,bbb,ccc){}

])

 

 

["num1", 'num2', 'num3', function add(n1, n2,n3){}]

var num1=10;

var num2=20;

var num5=50;

var num3=30

add(10, 20, 30);

 

 

3.能夠被注入的對象——全部的service/provider對象均可以被注入

  (1)$rootScope:在多個控制器間共享數據的服務

  (2)$interval:提供週期性定時器服務

  (3)$timeout:

  (4)$log:提供五個基本的日誌輸出服務

  (5)$http:提供異步HTTP請求(AJAX)服務

用法: $http({method:'GET', url:'/xx.php'}).

success(fn).

error(fn);

簡化版:  $http.get('url').success(fn);

$http.post('url', data).success(fn);

  (6)$location

 

 

 

 

4.ng模塊中提供的過濾器(filter)

  Filter: 把Model數據在顯示時以某種特定的格式呈現。

  (1)lowercase

語法: {{ 表達式 | lowercase }}

  (2)uppercase

語法: {{ 表達式 | uppercase }}

  (3)number

語法: {{ 表達式 | number }}

  {{ 表達式 | number : 小數位數 }}

  (3)currency

語法: {{ 表達式 | currency }}

  {{ 表達式 | currency : '貨幣符號' }}

  (3)date

語法: {{ 表達式 | date }}      默認格式: Sep 1, 2015

  {{ 表達式 | date : '日期時間格式'}}

 

 

5.Web項目中多頁應用和單頁應用的比較

  Mutiple Page Application

  Single Page Application

多頁應用

單頁應用(SPA)

項目中有多個完整的HTML頁面

整個項目中只有一個完整的HTML頁面;其它HTML文件都是HTML片斷

使用超連接、JS實現頁面跳轉

使用超連接、JS實現「僞跳轉」

全部的頁面請求都是同步的——客戶端在等待服務器給響應的時候,瀏覽器中時一片空白

全部的「僞頁面請求」都是異步請求——客戶端在等待下一個頁面片斷到來時,仍能夠顯示前一個頁面內容——瀏覽體驗更好

不便於實現兩個頁面間切換過場動畫

很容易實現兩個僞頁面間的過場切換動畫

瀏覽器須要不停的建立完整的DOM樹、刪除完整的DOM樹

瀏覽器只須要建立一個完整的DOM樹,此後的僞頁面切換其實只是在換某個div中的內容。

每一個頁面都須要加載本身的CSS和JS文件

整個項目的CSS和JS文件只須要加載一次

 

手動實現單頁應用的步驟:

(1)建立一個完整的HTML頁面(如index.html),引入所須要的全部CSS和JS;body中只須要一個僞頁面的容器元素,如<div></div>

(2)建立若干個僞HTML頁面/模板頁面:只須要聲明HTML片斷

(3)客戶端請求完整的HTML頁面,同時URL中再追加一個特殊的標記,如http://127.0.0.1/index.html#/start——指定要加載的僞頁面的名稱

(4)瀏覽器解析出僞頁面名稱,查找一個字典,找到該名稱對應的模板頁面的URL

window.location.hash

#/start            =>                template/start.html

#/m               =>                template/main.html

#/detail          =>                template/productdetail.html

(5)客戶端發起異步的AJAX請求,獲取模板頁面的內容,加載到index.html的僞頁面容器中便可

 

 

 

 

6.AngularJS提供的模塊——ngRoute

  Route:路由,經過某條線路找到目標內容。

  ngRoute模塊的用途:就是根據瀏覽器中URL中的一個特殊的地址標記(形如#/xxx),查找到該標記所對應的模板頁面,並異步加載到當前頁面的ngView指令中。使用步驟:

  (1)建立惟一完整的HTML頁面,其中聲明一個容器,ngView指令。引入angular.js和angular-route.js

  (2)建立多個模板頁面(習慣上放在一個特別的目錄下,如tpl)

  (3)建立Module,聲明依賴於ng和ngRoute兩個模塊。

  (4)在Module中配置路由字典。

  (5)使用瀏覽器作測試:

http://IP地址/index.html#/路由地址

 

 

7.ngRoute模塊中的僞頁面跳轉

(1)經過超連接跳轉

<a href="#/路由地址">    #不能省

(2)經過JS跳轉

<button ng-click="jump()"></button>

$scope.jump = function(){

//location.href="2.html"        不能使用多頁面應用中的跳轉

$location.path('/路由地址');    //#不能有

}

相關文章
相關標籤/搜索