Angular に関するフロントエンド面接の 13 の質問 (概要)

青灯夜游
リリース: 2021-04-07 10:28:57
転載
2512 人が閲覧しました

この記事では、angular に関するフロントエンドのインタビューでの 13 の質問を要約して共有します。一定の参考値があるので、困っている友達が参考になれば幸いです。

Angular に関するフロントエンド面接の 13 の質問 (概要)

1. ng-if と ng-show/hide の違いは何ですか?

最初の違いは、ng-if は後続の式が true の場合にのみこの dom ノードを作成することです。 ng-show が最初に作成され、display:blockdisplay:none を使用して表示または非表示を制御します。

2 番目の違いは、

ng-if が新しいスコープ ng-switchng-include## を (暗黙的に) 生成することです # 同じですインターフェイスを後で動的に作成する場合は true です。 これにより、

ng-if

で基本的な変数バインディング ng-model が使用され、外側の層 p ## で this# がバインドされることになります。 model 別の表示領域にバインドします。この時点ですでに 2 つの変数があるため、内側のレイヤーが変更されても、外側のレイヤーは同期的に変更されません。

<p>{{name}}</p>
<div ng-if="true">
	<input type="text" ng-model="name">
</div>
ログイン後にコピー
関連チュートリアルの推奨事項: 「angular チュートリアル

ng-show

には、最初のバージョンが付属していないため、この問題は発生しません。レベルの範囲。

この種の問題を回避する方法は、ページ内の要素を基本変数 (x) に直接バインドするのではなく、常にオブジェクト (data.x) のプロパティにバインドすることです。

2. ng-repeat が配列を反復するとき、配列内に同じ値がある場合、何が起こり、どのように解決しますか?

とプロンプトが表示されます リピーター内の重複は許可されません

。問題を解決するには、

track by $index を追加します。もちろん、配列内の各項目を一意に識別できる限り、通常の値を trace by することもできます (dom とデータの間の関連付けを確立するため)。 3. ng-click で書かれた式は、JS ネイティブ オブジェクトのメソッドを使用できますか?

ng-click

の式だけでなく、ネイティブの

JS メソッドも、ページ上にある限り直接呼び出すことはできません。これらは、ページに対応する Controller$scope に存在しません。 4. 工場、サービス、プロバイダーの関係は何ですか?

factory

:

service のメソッドとデータをオブジェクトに配置し、このオブジェクト service

を返します。 : コンストラクター メソッドを通じて

service を作成し、インスタンス化されたオブジェクトを返します。 provider

:

config # を通じて構成できる ## を作成します。 service$get で返されるのは、factory で作成された service の内容です。基盤となる実装の観点から見ると、 service

factory

を呼び出してそのインスタンスを返し、ファクトリは provider を呼び出してその $get で定義されたコンテンツを返します。 factory には service と同様の関数がありますが、factory が通常の function であり、何でも返すことができる点が異なります (returnにアクセスできるので、これらのプライベート変数の書き方はわかります); service はコンストラクターであり、返す必要はありません (

this

にバインドされているものはすべて返されます)にアクセスできます); provider

factory

の拡張バージョンであり、構成可能な factory を返します。 5. Angular でコントローラー間で通信するにはどうすればよいですか?

1、Service

2、events、バインドされたイベント

3 を指定します。 を使用します。 $rootScope

4、controller は、

$parent、$$childHead

などを直接使用します。 5、directive データ バインディングの属性を指定する

6. angular はデータ バインディングにどのようなメカニズムを使用しますか?原理の説明

使用されるダーティ チェック メカニズム、いわゆる双方向バインディングは、実際には、インターフェイス上の操作をリアルタイムでデータに反映できることを意味し、データはリアルタイムでインターフェースに表示できます。 AngularJS

$scope

変数でダーティ値チェックを使用して双方向データ バインディングを実装すると、変更をリッスンし、$scope.$watch を通じてコールバックをトリガーできます。 ; angular はダーティ チェック メカニズムを使用します。

angular

では、何かを UI にバインドするたびに、 $watch を挿入します。 を $watch キューに追加します。テンプレートがロードされると、テンプレートは linking ステージにあります (Angular コンパイル ステージとlinking ステージ - 翻訳者注)、Angular インタプリタは各 ディレクティブを検索し、必要な各 $watch を生成します。 <p>当浏览器接受到可以被<code>angular context处理的事件时就会触发digest循环,这个循环是由两个更小的循环组合起来的,一个是$watch列表,一个是$evalAsync列表,而$watch列表在$digest循环中被“脏值检查”解析,在digest将会遍历我们的watch,然后询问它是否有属性和值的变化,直到$watch队列都检查过,在检查数据变化的时候,由于并不知道这个事件是对哪些数据进行了更改,以及这个事件有可能造成事件之外的其他任何地方的数据更改,所以必须进行一次大检查,将所有“注册”过的值全部检查一遍,一次检查称为一个周期,每次最少检查两遍,因为第二遍用来确认,前一遍的变动中是否有数据的变动,导致了其他数据的变动,如果第二次有变动的话,会再执行一遍,直到最后两次完全一致,则停止检查(其实就是个(递归(遍历))的过程),考虑到内存的消耗和死循环的风险,脏检查每个周期最多递归执行10遍,如果超过10遍就会抛出一个错误。当$digest循环结束时,DOM相应地变化。
angular

ng-click,ng-change,ng-blur...就是对各类用户事件的封装

$timeout,$http,$window,$location...就是对各种JS/API事件的封装

ng-model,以及控制器中的数据,就是对值的“注册”

$scope 本质是一个总的事件逻辑的封装容器,同时抽象为数据载体,实质上数据都存在于浏览器堆内存中

$scope.apply() & $scope.digest()Angular中的“数据大检查”的function

所以如果我们使用了非Angular封装的事件改编数据时,要手动执行一次大检查

由于Angular这种脏检查的方法效率不高,如果一个页面绑定的view超过2000个,就可能存在比较明显的性能问题,官方称之为“脏检查”

举个例子

<button ng-click="val=val+1">increase 1</button>
ログイン後にコピー

click 时会产生一次更新的操作(至少触发两次 $digest 循环)

按下按钮浏览器接收到一个事件,进入到angular context

$digest 循环开始执行,查询每个 $watch 是否变化

由于监视$scope.val$watch 报告了变化,因此强制再执行一次 $digest 循环 新的 $digest 循环未检测到变化

浏览器拿回控制器,更新 $scope.val 新值对应的 dom

$digest 循环的上限是 10 次(超过 10次后抛出一个异常,防止无限循环)。

7、一个 angular 应用应当如何良好地分层?

目录结构的划分

对于小型项目,可以按照文件类型组织,比如:

css
js
  controllers 
  models 
  services 
  filters 
templates
ログイン後にコピー

但是对于规模较大的项目,最好按业务模块划分,比如:

css
modules
  account 
    controllers 
    models 
    services 
    filters 
    templates 
  disk 
    controllers 
    models 
    services 
    filters 
    templates
ログイン後にコピー

modules 下最好再有一个 common 目录来存放公共的东西。

逻辑代码的拆分

作为一个 MVVM 框架,Angular 应用本身就应该按照 模型,视图模型(控制器),视图来划分。

这里逻辑代码的拆分,主要是指尽量让 controller 这一层很薄。提取共用的逻辑到 service 中 (比如后台数据的请求,数据的共享和缓存,基于事件的模块间通信等),提取共用的界面操作到 directive 中(比如将日期选择、分页等封装成组件等),提取共用的格式化操作到 filter 中等等。

在复杂的应用中,也可以为实体建立对应的构造函数,比如硬盘(Disk)模块,可能有列表、新建、详情这样几个视图,并分别对应的有 controller,那么可以建一个 Disk 构造函数,里面完成数据的增删改查和验证操作,有跟 Disk 相关的 controller,就注入 Disk 构造器并生成一个实例,这个实例就具备了增删改查和验证方法。这样既层次分明,又实现了复用(让 controller 层更薄了)。

8、angular 应用常用哪些路由库,各自的区别是什么?

Angular1.x 中常用 ngRouteui.router,还有一种为 Angular2 设计的 new router(面向组件)。后面那个没在实际项目中用过,就不讲了。

无论是 ngRoute 还是 ui.router,作为框架额外的附加功能,都必须以 模块依赖 的形式被引入。

区别

ngRoute 模块是 Angular 自带的路由模块,而 ui.router 模块是基于 ngRoute模块开发的第三方模块。

ui.router 是基于 state (状态)的, ngRoute 是基于 url 的,ui.router模块具有更强大的功能,主要体现在视图的嵌套方面。

使用 ui.router 能够定义有明确父子关系的路由,并通过 ui-view 指令将子路由模版插入到父路由模板的 <p ui-view></p>中去,从而实现视图嵌套。而在 ngRoute 中不能这样定义,如果同时在父子视图中 使用了 <p ng-view></p>会陷入死循环。

分属不同团队进行开发的 angular 应用,如果要做整合,可能会遇到哪些问题,如何解决?
可能会遇到不同模块之间的冲突。

比如一个团队所有的开发在 moduleA 下进行,另一团队开发的代码在 moduleB 下

angular.module('myApp.moduleA', [])
    .factory('serviceA', function(){ 
        ... 
    }) 
angular.module('myApp.moduleB', [])
    .factory('serviceA', function(){ 
        ... 
    })    

angular.module('myApp', ['myApp.moduleA', 'myApp.moduleB'])
ログイン後にコピー

会导致两个 module 下面的 serviceA 发生了覆盖。

貌似在 Angular1.x 中并没有很好的解决办法,所以最好在前期进行统一规划,做好约定,严格按照约定开发,每个开发人员只写特定区块代码。

9、angular 的缺点有哪些?

强约束

导致学习成本较高,对前端不友好。

但遵守 AngularJS 的约定时,生产力会很高,对 Java 程序员友好。

不利于 SEO

因为所有内容都是动态获取并渲染生成的,搜索引擎没法爬取。

一种解决办法是,对于正常用户的访问,服务器响应 AngularJS 应用的内容;对于搜索引擎的访问,则响应专门针对 SEO 的HTML页面。

性能问题

作为 MVVM 框架,因为实现了数据的双向绑定,对于大数组、复杂对象会存在性能问题。

可以用来 优化 Angular 应用的性能 的办法:

减少监控项(比如对不会变化的数据采用单向绑定)

主动设置索引(指定 track by,简单类型默认用自身当索引,对象默认使用 $$hashKey,比如改为 track by item.id
降低渲染数据量(比如分页,或者每次取一小部分数据,根据需要再取)

数据扁平化(比如对于树状结构,使用扁平化结构,构建一个 map 和树状数据,对树操作时,由于跟扁平数据同一引用,树状数据变更会同步到原始的扁平数据)

另外,对于Angular1.x ,存在 脏检查模块机制 的问题。

移动端

可尝试 Ionic,但并不完善。

10、解释下什么是$rootScrope以及和$scope的区别?

通俗的说$rootScrope 页面所有$scope的父亲

如何产生$rootScope$scope吧。

step1:Angular解析ng-app然后在内存中创建$rootScope

step2:angular回继续解析,找到{{}}表达式,并解析成变量。

step3:接着会解析带有ng-controllerp然后指向到某个controller函数。这个时候在这个controller函数变成一个$scope对象实例。

**11、如何取消 $timeout, 以及停止一个$watch()? **

停止 $timeout我们可以用cancel

var customTimeout = $timeout(function () {
 // your code
}, 1000);
$timeout.cancel(customTimeout);
ログイン後にコピー

停掉一个$watch

// .$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(); 
  ... 
 }
});
ログイン後にコピー

12、Angular Directive中restrict 中分别可以怎样设置?scope中@,=,&有什么区别?

restrict中可以分别设置:

A匹配属性

E匹配标签

C匹配class

M 匹配注释

当然你可以设置多个值比如AEC,进行多个匹配。

在scope中,@,=,&在进行值绑定时分别表示

@获取一个设置的字符串,它可以自己设置的也可以使用{<!-- -->{yourModel}}进行绑定的;

= 双向绑定,绑定scope上的一些属性;

&用于执行父级scope上的一些表达式,常见我们设置一些需要执行的函数

13、$apply()$digest()的区别

セキュリティ: $apply() はパラメータを function() として受け取ることができます。この functiontry … catch # でラップされます## ブロックなので、例外が発生すると、その例外は $ExceptionHandler サービス によって処理されます。

$apply により、ng$ダイジェスト サイクル に入り、$rootScope (深さが最初) からトラバースを開始します。データの変更を確認します。

$digestこのスコープとその子 scope のみがチェックされます。現在の操作がそれらにのみ影響することが確実な場合は、$digest# を使用してください## パフォーマンスがわずかに向上する可能性があります。 プログラミング関連の知識について詳しくは、

プログラミング ビデオ

をご覧ください。 !

以上がAngular に関するフロントエンド面接の 13 の質問 (概要)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート