angularjs面試總結
ng-if 跟 ng-show/hide 的區別
- ng-if 在後面表示式為 true 的時候才建立這個 dom 節點,ng-show 是初始時就建立了,用 display:block 和 display:none 來控制顯示和不顯示。
- ng-if 會(隱式地)產生新作用域,ng-switch 、 ng-include 等會動態建立一塊介面的也是如此。
angular 的資料繫結
髒檢查機制。雙向資料繫結是 AngularJS 的核心機制之一。當 view 中有任何資料變化時,會更新到 model ,當 model 中資料有變化時,view 也會同步更新,顯然,這需要一個監控。
原理就是,Angular 在 scope 模型上設定了一個監聽佇列,用來監聽資料變化並更新 view 。每次繫結一個東西到 view 上時 AngularJS 就會往 $watch 佇列裡插入一條 $watch,用來檢測它監視的 model 裡是否有變化的東西。當瀏覽器接收到可以被 angular context 處理的事件時,$digest 迴圈就會觸發,遍歷所有的 $watch,最後更新 dom。
例如,click 時會產生一次更新的操作(至少觸發兩次 $digest 迴圈)
<button ng-click="val=val+1">increase 1</button>
按下按鈕
- 瀏覽器接收到一個事件,進入到 angular context
- $digest 迴圈開始執行,查詢每個 $watch 是否變化
- 由於監視 $scope.val 的 $watch 報告了變化,因此強制再執行一次 $digest 迴圈
- 新的 $digest 迴圈未檢測到變化
- 瀏覽器拿回控制器,更新 $scope.val 新值對應的 dom
$digest 迴圈的上限是 10 次(超過 10次後丟擲一個異常,防止無限迴圈)。
兩個平級介面塊 a 和 b,如果 a 中觸發一個事件,有哪些方式能讓b 知道
- 共用服務
- $rootScope
- 廣播
ngRoute 和 ui.router
區別
ngRoute 模組是 Angular 自帶的路由模組,而 ui.router 模組是基於 ngRoute模組開發的第三方模組。
ui.router 是基於 state (狀態)的, ngRoute 是基於 url 的,ui.router模組具有更強大的功能,主要體現在檢視的巢狀方面。
使用 ui.router 能夠定義有明確父子關係的路由,並通過 ui-view 指令將子路由模版插入到父路由模板的 <div ui-view></div> 中去,從而實現檢視巢狀。而在 ngRoute 中不能這樣定義,如果同時在父子檢視中 使用了 <div ng-view></div> 會陷入死迴圈。