總結(jié)十個(gè)Angular.js由淺入深的面試問(wèn)題
一、ng-show/ng-hide 與 ng-if的區(qū)別?
我們都知道ng-show/ng-hide實(shí)際上是通過(guò)display來(lái)進(jìn)行隱藏和顯示的。而ng-if實(shí)際上控制dom節(jié)點(diǎn)的增刪除來(lái)實(shí)現(xiàn)的。因此如果我們是根據(jù)不同的條件來(lái)進(jìn)行dom節(jié)點(diǎn)的加載的話,那么ng-if的性能好過(guò)ng-show.
二、解釋下什么是$rootScrope以及和$scope的區(qū)別?
通俗的說(shuō)$rootScrope 頁(yè)面所有$scope的父親。

我們來(lái)看下如何產(chǎn)生$rootScope和$scope吧。
step1:Angular解析ng-app然后在內(nèi)存中創(chuàng)建$rootScope。
step2:angular回繼續(xù)解析,找到{{}}表達(dá)式,并解析成變量。
step3:接著會(huì)解析帶有ng-controller的div然后指向到某個(gè)controller函數(shù)。這個(gè)時(shí)候在這個(gè)controller函數(shù)變成一個(gè)$scope對(duì)象實(shí)例。
三、表達(dá)式 {{yourModel}}是如何工作的?
它依賴于 $interpolation服務(wù),在初始化頁(yè)面html后,它會(huì)找到這些表達(dá)式,并且進(jìn)行標(biāo)記,于是每遇見(jiàn)一個(gè){{}},則會(huì)設(shè)置一個(gè)$watch。而$interpolation會(huì)返回一個(gè)帶有上下文參數(shù)的函數(shù),最后該函數(shù)執(zhí)行,則算是表達(dá)式$parse到那個(gè)作用域上。
四、Angular中的digest周期是什么?
每個(gè)digest周期中,angular總會(huì)對(duì)比scope上model的值,一般digest周期都是自動(dòng)觸發(fā)的,我們也可以使用$apply進(jìn)行手動(dòng)觸發(fā)。
五、 如何取消 $timeout, 以及停止一個(gè)$watch()?
停止 $timeout我們可以用cancel:
var customTimeout = $timeout(function () {
// your code
}, 1000);
$timeout.cancel(customTimeout);
停掉一個(gè)$watch:
// .$watch() 會(huì)返回一個(gè)停止注冊(cè)的函數(shù)
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();
...
}
});
六、Angular Directive中restrict 中分別可以怎樣設(shè)置?scope中@,=,&有什么區(qū)別?
restrict中可以分別設(shè)置:
A匹配屬性
E匹配標(biāo)簽
C匹配class
M 匹配注釋
當(dāng)然你可以設(shè)置多個(gè)值比如AEC,進(jìn)行多個(gè)匹配。
在scope中,@,=,&在進(jìn)行值綁定時(shí)分別表示
@獲取一個(gè)設(shè)置的字符串,它可以自己設(shè)置的也可以使用{{yourModel}}進(jìn)行綁定的;
= 雙向綁定,綁定scope上的一些屬性;
& 用于執(zhí)行父級(jí)scope上的一些表達(dá)式,常見(jiàn)我們?cè)O(shè)置一些需要執(zhí)行的函數(shù)
angular.module('docsIsolationExample', [])
.controller('Controller', ['$scope', function($scope) {
$scope.alertName = function() {
alert('directive scope &');
}
}])
.directive('myCustomer', function() {
return {
restrict: 'E',
scope: {
clickHandle: '&'
},
template: '<button ng-click="testClick()">Click Me</button>',
controller: function($scope) {
$scope.testClick = function() {
$scope.clickHandle();
}
}
};
});
<div ng-app="docsIsolationExample"> <div ng-controller="Controller"> <my-customer click-handle="alertName()"></my-customer> </div> </div>
< 進(jìn)行單向綁定。
七、 列出至少三種實(shí)現(xiàn)不同模塊之間通信方式?
1、Service
2、events,指定綁定的事件
3、使用 $rootScope
4、controller之間直接使用$parent, $$childHead等
5、directive 指定屬性進(jìn)行數(shù)據(jù)綁定
八、有哪些措施可以改善Angular 性能
官方提倡的,關(guān)閉debug,$compileProvider
myApp.config(function ($compileProvider) {
$compileProvider.debugInfoEnabled(false);
});
使用一次綁定表達(dá)式即{{::yourModel}}
減少watcher數(shù)量
在無(wú)限滾動(dòng)加載中避免使用ng-repeat
使用性能測(cè)試的小工具去挖掘你的angular性能問(wèn)題,我們可以使用簡(jiǎn)單的console.time()也可以借助開(kāi)發(fā)者工具以及Batarang
console.time("TimerName");
//your code
console.timeEnd("TimerName");
九、你認(rèn)為在Angular中使用jQuery好么?
這是一個(gè)開(kāi)放性的問(wèn)題,盡管網(wǎng)上會(huì)有很多這樣的爭(zhēng)論,但是普遍還是認(rèn)為這并不是一個(gè)特別好的嘗試。其實(shí)當(dāng)我們學(xué)習(xí)Angular的時(shí)候,我們應(yīng)該做到從0去接受angular的思想,數(shù)據(jù)綁定,使用angular自帶的一些api,合理的路由組織和,寫(xiě)相關(guān)指令和服務(wù)等等。angular自帶了很多api可以完全替代掉jquery中常用的api,我們可以使用angular.element,$http,$timeout,ng-init等。
我們不妨再換個(gè)角度,如果業(yè)務(wù)需求,而對(duì)于一個(gè)新人(比較熟悉jQuery)的話,或許你引入jQuery可以讓它在解決問(wèn)題,比如使用插件上有更多的選擇,當(dāng)然這是通過(guò)影響代碼組織來(lái)提高工作效率,隨著對(duì)于angular理解的深入,在重構(gòu)時(shí)會(huì)逐漸摒棄掉當(dāng)初引入jquery時(shí)的一些代碼。(😂Po主就是這樣的人,希望不要被嘲笑,業(yè)務(wù)卻是趕著走)
所以我覺(jué)得兩種框架說(shuō)完全不能一起用肯定是錯(cuò)的,但是我們還是應(yīng)該盡力去遵循angular的設(shè)計(jì)。
十、如何進(jìn)行angular的單元測(cè)試
我們可以使用karam+jasmine 進(jìn)行單元測(cè)試,我們通過(guò)ngMock引入angular app然后自行添加我們的測(cè)試用例。 一段簡(jiǎn)單的測(cè)試代碼:
describe('calculator', function () {
beforeEach(module('calculatorApp'));
var $controller;
beforeEach(inject(function(_$controller_){
$controller = _$controller_;
}));
describe('sum', function () {
it('1 + 1 should equal 2', function () {
var $scope = {};
var controller = $controller('CalculatorController', { $scope: $scope });
$scope.x = 1;
$scope.y = 2;
$scope.sum();
expect($scope.z).toBe(3);
});
});
});
十一、總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望對(duì)大家的學(xué)習(xí)和工作能有所幫助。如果有疑問(wèn)可以留言討論。
- 解決angular的$http.post()提交數(shù)據(jù)時(shí)后臺(tái)接收不到參數(shù)值問(wèn)題的方法
- AngularJs解決跨域問(wèn)題案例詳解(簡(jiǎn)單方法)
- 解決angular的post請(qǐng)求后SpringMVC后臺(tái)接收不到參數(shù)值問(wèn)題的方法
- angularjs在ng-repeat中使用ng-model遇到的問(wèn)題
- AngularJS頁(yè)面訪問(wèn)時(shí)出現(xiàn)頁(yè)面閃爍問(wèn)題的解決
- AngularJS上拉加載問(wèn)題解決方法
- 給angular加上動(dòng)畫(huà)效遇到的問(wèn)題總結(jié)
- Angular 頁(yè)面跳轉(zhuǎn)時(shí)傳參問(wèn)題
- AngularJS模塊管理問(wèn)題的非常規(guī)處理方法
- angular十大常見(jiàn)問(wèn)題
相關(guān)文章
angularjs循環(huán)對(duì)象屬性實(shí)現(xiàn)動(dòng)態(tài)列的思路詳解
這篇文章主要介紹了angularjs循環(huán)對(duì)象屬性實(shí)現(xiàn)動(dòng)態(tài)列的思路詳解,本文給大家分享一個(gè)demo代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11
AngularJS實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)后自動(dòng)彈出對(duì)話框?qū)嵗a
這篇文章主要介紹了AngularJS實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)后自動(dòng)彈出對(duì)話框?qū)嵗a,然后在文章下面給大家介紹了angularjs頁(yè)面加載后自動(dòng)彈窗的實(shí)例代碼,感興趣的朋友參考下吧2017-08-08
AngularJs Dependency Injection(DI,依賴注入)
本文主要介紹AngularJs Dependency Injection,這里整理了詳細(xì)資料及示例代碼有興趣的小伙伴可以參考下2016-09-09
AngularJS使用ngOption實(shí)現(xiàn)下拉列表的實(shí)例代碼
這篇文章主要介紹了AngularJS使用ngOption實(shí)現(xiàn)下拉列表的實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-01-01
AngularJS 中使用Swiper制作滾動(dòng)圖不能滑動(dòng)的解決方法
Swiper是目前較為流行的移動(dòng)端觸摸滑動(dòng)插件,因?yàn)槠浜?jiǎn)單好用易上手,受到很多前端開(kāi)發(fā)者的歡迎。這篇文章主要介紹了AngularJS 中使用Swiper制作滾動(dòng)圖不能滑動(dòng)的解決方法,需要的朋友可以參考下2016-11-11
AngularJS基礎(chǔ) ng-value 指令簡(jiǎn)單示例
本文主要介紹AngularJS ng-value 指令,這里對(duì)ng-value 的基礎(chǔ)資料做了整理,并附實(shí)例代碼,有需要的小伙伴可以參考下2016-08-08
Angular.JS去掉訪問(wèn)路徑URL中的#號(hào)詳解
最近天天都在用AngularJS,各類(lèi)文檔也都看過(guò)好幾遍,但總是些編程上的事找不到優(yōu)雅的解決辦法。今天終于把AngularJS的項(xiàng)目訪問(wèn)路徑URL里的#號(hào)去掉了,這個(gè)問(wèn)題不見(jiàn)得有多難,關(guān)鍵是花多長(zhǎng)時(shí)間去理解AngularJS框架本身,下面來(lái)看看詳細(xì)介紹,需要的朋友可以參考下。2017-03-03
Angular 2父子組件數(shù)據(jù)傳遞之局部變量獲取子組件其他成員
這篇文章主要給大家介紹了關(guān)于Angular 2父子組件之間數(shù)據(jù)傳遞之局部變量獲取子組件其他成員的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-07-07
使用AngularJS對(duì)路由進(jìn)行安全性處理的方法
這篇文章主要介紹了使用AngularJS對(duì)路由進(jìn)行安全性處理的方法,AngularJS是一款高人氣的JavaScript庫(kù),需要的朋友可以參考下2015-06-06

