먼저 현재의 기술 환경에 대해 이야기해보겠습니다: angle1.6, ui-route, require 질문:
1. ui-route에 의해 로드된 템플릿과 동적으로 등록된 컨트롤러 중 어느 것이 컴파일되고 실행됩니까? 첫 번째? 예: 템플릿의 #id 너비를 얻으려면 $timeout이 있어야 합니까? 그렇지 않으면 undefine
이 나타납니다. 2. 템플릿 전에 사용자 정의 명령의 컴파일이 로드됩니까? 병렬로 로드되나요?
조금 헷갈리는 부분이 있어서 답변을 구합니다. 관련 글과 설명도 감사드립니다!
추가 질문: {{}}가 자동으로 유형을 문자열로 변환합니까?
감사합니다, 답변도 너무 감사드립니다
官方有详细解释,关于编译过程的介绍:
HTML 컴파일은 세 단계로 이루어집니다.
$compile은 DOM을 탐색하고 지시문과 일치합니다.
컴파일러가 요소가 지시문과 일치하는 것을 발견하면
지시문이 DOM
요소와 일치하는 지시문 목록에 추가됩니다. 단일 요소가 여러 지시문과 일치할 수 있습니다.
DOM 요소와 일치하는 모든 지시어가 식별되면
컴파일러는 우선순위에 따라 지시어를 정렬합니다.
각 지시문의 컴파일 기능이 실행됩니다. 각 컴파일
함수에는 DOM을 수정할 기회가 있습니다. 각 컴파일 함수
는 링크 함수를 반환합니다. 이러한 함수는 각 지시문의 반환된
링크 함수를 호출하는
"결합된" 링크 함수로 구성됩니다.
$compile은 이전 단계에서 결합된
링크 함수를 호출하여 템플릿을 범위와 연결합니다. 그러면 개별 지시문의
연결 기능이 호출되고, 요소에 리스너를 등록
하고, 각
지시문이 구성한 대로 범위를 사용하여 $watch를 설정합니다.
이 결과는 범위와 DOM 간의 라이브 바인딩입니다. 따라서 이 시점에서 컴파일된 범위의 모델 변경 사항이 DOM에 반영됩니다.
具体请题主详读 https://docs.angularjs.org/gu... 这篇关于compiler的文章.
제 생각에 순서는 다음과 같아야 합니다. 템플릿을 로드하고 동시에 컨트롤러로 이동하여 컨트롤러에서 데이터를 초기화한 다음 $digest 단계에 들어가 템플릿을 렌더링합니다. 따라서 컨트롤러 로딩 프로세스 중에 템플릿의 #id 너비를 가져오지 못할 수 있습니다.
$digest가 끝난 후 타임아웃에 코드를 실행하고 $digest를 다시 트리거하는 $timeout을 작성하세요.
사용자 정의 명령의 컴파일 단계는 실제로 템플릿의 구조를 결정합니다. 링크 단계에서는 데이터를 준비한 다음 템플릿을 렌더링합니다.
잘못된 부분이 있으면 정정하고 토론해주세요.