Angular의 서비스 중에는 ng의 핵심이라고 할 수 있는 서비스가 있기 때문에 꼭 이해하셔야 할 서비스가 있습니다. 오늘은 ng, $parse, $compile 두 가지 핵심 서비스를 소개하겠습니다. 사실 많은 사람들이 이 두 서비스에 대해 이야기하지만, 나는 이 두 서비스에 대한 나의 이해를 이야기하기 위해 여기에 왔습니다.
$eval은 실제로 서비스가 아니며 서비스로 간주할 수 없습니다. 또한 구문 분석을 기반으로 하기 때문에 다른 것으로 간주할 수 있습니다. $parse 버전입니다. ng 소스 코드에서 $eval의 정의를 살펴보겠습니다.
$eval: function(expr, locals) { return $parse(expr)(this, locals); },
.controller('TestCtrl', function($scope) { $scope.test = "Boo!!!" })
<body ng-controller="TestCtrl"> {{test}} </body>
var getter = $parse('user.name'); var setter = getter.assign; var context = {user:{name:'angular'}}; var locals = {user:{name:'local'}}; expect(getter(context)).toEqual('angular'); setter(context, 'newValue'); expect(context.user.name).toEqual('newValue'); expect(getter(context, locals)).toEqual('local');
getter(context)).toEqual('angular') //实际上就是 $parse('user.name')(context)
setter(context, 'newValue');//实际上就是 $parse('user.name').assign(context, 'newValue') expect(context.user.name).toEqual('newValue');//测试数据上下文的值是否被改变
1. 현재 표현식 user.name 가져오기2. 현재 컨텍스트 객체 {user:{name:'angular'}} 가져오기3. , 컨텍스트 객체 프로그래밍 {user:{name:'newValue'}}따라서 컨텍스트 객체가 변경되었습니다. getter 메서드를 사용하여 표현식을 다시 가져오면 컨텍스트가 {user:{name: 'angular' }} --> {user:{name:'newValue'}}, 최종적으로 얻은 표현식의 값은 당연히 "newValue"이므로 테스트 코드도 통과됩니다.
expect(getter(context, locals)).toEqual('local');//实际上就是$parse('user.name')(context, locals)
$eval로 돌아가면, $eval 소스 코드에서 $eval에는 get 함수만 있고 set 함수는 없지만 때로는 값 수정 효과를 얻기 위해 두 번째 컨텍스트를 전달하도록 선택할 수도 있습니다.
여기서 $parse 서비스가 끝났고, 다음 단계는 $compile입니다
---------------------- - ---------------------------
$parse의 개념을 이해하시면 $compile도 비슷하다고 생각합니다. 이해하세요. 실제로 $parse와 매우 유사합니다. 그러나 이는 HTML 코드 조각을 구문 분석하고 그 기능은 명령의 핵심 서비스이기도 한 죽은 템플릿을 라이브 템플릿으로 바꾸는 것입니다.
예를 들어 HTML 코드
$compile('dead template')(컨텍스트 객체), 죽은 템플릿이 라이브 템플릿에 프로그래밍되고 이 라이브 HTML 코드에 대해 현재 노드에 추가하는 등의 작업을 수행할 수 있도록 합니다. , 등 잠깐만요.
그러나 명령에서는 사전 링크와 사후 링크 두 가지 기능을 반환합니다
첫 번째로 실행되는 것은 사전 링크이며 동일한 명령에 대한 순회 순서는 Traversal from Traversal에서 옵니다. 상위 노드에서 하위 노드로. 이 단계에서 DOM 노드는 아직 안정화되지 않았으며 일부 바인딩 이벤트 작업을 수행할 수 없지만 여기에서 일부 초기화 데이터를 처리할 수 있습니다.
두 번째 실행은 흔히 링크 기능이라고 부르는 포스트 링크입니다. 이 단계에서는 일반적으로 DOM 노드가 안정화됩니다. 여기.