首先$parse和$compile是Angular.js自帶的兩個服務(wù)葫隙。而$eval是scope的一個方法缅刽,和$parse類似。
一.$parse
$parse是一個解析表達(dá)式的服務(wù)境氢,比如你有<h1>{{test}}</h1>,$parse就是幫助你在當(dāng)前控制器的scope(上下文)去尋找test的值轮洋。
$parse官方文檔:
var? getter = $parse('user.name');
var? setter = getter.assign;
var? context = {user:{name:'angular'}};
var? locals = {user:{name:'local'}};
expect(getter(context)).toEqual('angular');?? //true
解析:getter(context)實際上就是$parse('user.name')(context)。
1.獲取當(dāng)前的表達(dá)式user.name。
2.獲取當(dāng)前的上下文對象{user:{name:'angular'}}暖庄。
3.在上下文對象中尋找表達(dá)式聊替,最終獲得“angular“這個字符串。
setter(context, 'newValue');
解析:$parse('user.name').assign(context,'newValue');
1.獲取當(dāng)前的表達(dá)式user.name
2.獲取當(dāng)前的上下文對象{user:{name:'angular'}}
3.改變表達(dá)式中的值培廓,將上下文對象編程{user:{name:'newValue'}}
expect(context.user.name).toEqual('newValue'); //true
expect(getter(context, locals)).toEqual('local');? //true
解析:$parse('user.name')(context惹悄,locals);
1.獲取當(dāng)前的表達(dá)式user.name。
2.獲取當(dāng)前的上下文對象{user:{name:'angular'}}肩钠。
3.覆蓋當(dāng)前的上下文{user:{name:'local'}}泣港。
4.獲取解析之后表達(dá)式的值。
$eval的源碼:
$eval:function(express,environment){
return $parse(express)(this,environment);
}
二.$compile
將一個死模板編程活模板
$compile(模板)(上下文);
它會返回兩個函數(shù)pre-link和post-link
第一個執(zhí)行的是pre-link价匠,它對于同一個指令的遍歷順序是從父節(jié)點到子節(jié)點的遍歷当纱,在這個階段,dom節(jié)點還沒有穩(wěn)定下來踩窖,無法做一些綁定事件的操作坡氯,但是我們可以在這里進(jìn)行一些初始化數(shù)據(jù)的處理。
第二個執(zhí)行的是post-link洋腮,也就是我們常說的link函數(shù)箫柳,他是從子節(jié)點到父節(jié)點遍歷的,在這個階段啥供,DOM節(jié)點已經(jīng)穩(wěn)定下來了悯恍,我們一般會在這里進(jìn)行很多的操作。
參考原文文章:https://www.cnblogs.com/HeJason/p/5493357.html