Angular面試題


1. ng-show/ng-hide 與 ng-if的區別?

我們都知道ng-show/ng-hide實際上是通過display來進行隱藏和顯示的。而ng-if實際上控制dom節點的增刪除來實現的。因此如果我們是根據不同的條件來進行dom節點的加載的話,那么ng-if的性能好過ng-show. 這是因為多余的節點和里面的img圖片都完全不需要加載。 

2.解釋下什么是rootScrope以及和scope的區別?

通俗的說rootScrope頁面所有scope的父親。

我們來看下如何產生rootScope和scope吧。

step1:Angular解析ng-app然后在內存中創建$rootScope。

step2:angular回繼續解析,找到{{}}表達式,並解析成變量。

step3:接着會解析帶有ng-controller的div然后指向到某個controller函數。這個時候在這個controller函數變成一個$scope對象實例。

3. 表達式 {{yourModel}}是如何工作的?

它依賴於 interpolation服務,在初始化頁面html后,它會找到這些表達式,並且進行標記,於是每遇見一個,則會設置一個watch。而interpolation會返回一個帶有上下文參數的函數,最后該函數執行,則算是表達式parse到那個作用域上。

4. Angular中的digest周期是什么?

每個digest周期中,angular總會對比scope上model的值,一般digest周期都是自動觸發的,我們也可以使用$apply進行手動觸發。

5. 如何取消 timeout,以及停止一個watch()?

var customTimeout = $timeout(function () {

  // your code

}, 1000);

 

$timeout.cancel(customTimeout);

 

// .$watch() 會返回一個停止注冊的函數

function that we store to a variable

var deregisterWatchFn = $rootScope.$watch(‘someGloballyAvailableProperty’, function (newVal) {

  if (newVal) {

    // we invoke that deregistration function, to disable the watch

    deregisterWatchFn();

    ...

  }

});

 

6. Angular Directive中restrict 中分別可以怎樣設置?scope中@,=,&有什么區別?

A匹配屬性

E匹配標簽

C匹配class

M 匹配注釋

當然你可以設置多個值比如AEC,進行多個匹配。 

在scope中,@,=,&在進行值綁定時分別表示

@獲取一個設置的字符串,它可以自己設置的也可以使用{{yourModel}}進行綁定的;

= 雙向綁定,綁定scope上的一些屬性;

& 用於執行父級scope上的一些表達式,常見我們設置一些需要執行的函數

7. 列出至少三種實現不同模塊之間通信方式?

Service、Factory服務

events,指定綁定的事件

使用 $rootScope

controller之間直接使用parent,$childHead等

directive 指定屬性進行數據綁定

8. 有哪些措施可以改善Angular 性能

官方提倡的,關閉debug,$compileProvider。

myApp.config(function ($compileProvider) {

  $compileProvider.debugInfoEnabled(false);

});

使用一次綁定表達式即{{::yourModel}}

 減少watcher數量

 在無限滾動加載中避免使用ng-repeat,關於解決方法可以參考這篇文章

使用性能測試的小工具去挖掘你的angular性能問題,我們可以使用簡單的console.time()也可以借助開發者工具以及Batarang

console.time("TimerName");

//your code

console.timeEnd("TimerName"); 

9. 你認為在Angular中使用jQuery好么?

如果業務需求,而對於一個新人(比較熟悉jQuery)的話,或許你引入jQuery可以讓它在解決問題,比如使用插件上有更多的選擇,當然這是通過影響代碼組織來提高工作效率,隨着對於angular理解的深入,在重構時會逐漸摒棄掉當初引入jquery時的一些代碼。(😂Po主就是這樣的人,希望不要被嘲笑,業務卻是趕着走)

所以我覺得兩種框架說完全不能一起用肯定是錯的,但是我們還是應該盡力去遵循angular的設計

10. 如何進行angular的單元測試

1、請解釋Angular 2應用程序的生命周期hooks是什么?

Angular 2組件/指令具有生命周期事件,是由@angular/core管理的。@angular/core會創建組件,渲染它,創建並呈現它的后代。當@angular/core的數據綁定屬性更改時,處理就會更改,在從DOM中刪除其模板之前,就會銷毀掉它。Angular提供了一組生命周期hooks(特殊事件),可以被分接到生命周期中,並在需要時執行操作。構造函數會在所有生命周期事件之前執行。每個接口都有一個前綴為ng的hook方法。例如,ngOnint界面的OnInit方法,這個方法必須在組件中實現。

一部分事件適用於組件/指令,而少數事件只適用於組件。

ngOnChanges:當Angular設置其接收當前和上一個對象值的數據綁定屬性時響應。

 ngOnInit:在第一個ngOnChange觸發器之后,初始化組件/指令。這是最常用的方法,用於從后端服務檢索模板的數據。

 ngDoCheck:檢測並在Angular上下文發生變化時執行。每次更改檢測運行時,會被調用。

 ngOnDestroy:在Angular銷毀指令/組件之前清除。取消訂閱可觀察的對象並脫離事件處理程序,以避免內存泄漏。

 

組件特定hooks:

l  ngAfterContentInit:組件內容已初始化完成

l  ngAfterContentChecked:在Angular檢查投影到其視圖中的綁定的外部內容之后。

l  ngAfterViewInit:Angular創建組件的視圖后。

l  ngAfterViewChecked:在Angular檢查組件視圖的綁定之后。

2、使用Angular 2,和使用Angular 1相比,有什么優勢?

1、Angular 2是一個平台,不僅是一種語言

2、更好的速度和性能

3、更簡單的依賴注入

4、1、模塊化,跨平台

5、具備ES6和Typescript的好處。

6、靈活的路由,具備延遲加載功能

7、更容易學習

什么是事件發射器?它是如何在Angular 2中工作的?

Angular 2不具有雙向digest cycle,這是與Angular 1不同的。在Angular2中,組件中發生的任何改變總是從當前組件傳播到其所有子組件中。如果一個子組件的更改需要反映到其父組件的層次結構中,我們可以通過使用事件發射器api來發出事件。

簡而言之,EventEmitter是在@ angular/core模塊中定義的類,由組件和指令使用,用來發出自定義事件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM