Angular JS는 DOM의 변화를 감시
하나 있어.auto-carousel
링크된 요소의 하위 요소를 통해 반복되는 지시문입니다.
단, 자녀는 아직 DOM에 로드되지 않았습니다.그 이유는 자녀는ng-if
의 표현식은 아직 해석되지 않았습니다.
부모 디렉티브에 DOM 트리가 변경되었음을 확인하려면 어떻게 해야 합니까?
<ul class="unstyled" auto-carousel>
<li class="slide" ng-if="name">{{name}}</li>
...
<li class="slide" ng-if="email">{{email}}</li>
</ul>
나는 할 수 있다$timeout
믿을 수 없는 것 같아요나도 쓸 수 있어ng-show
대신ng-if
하지만 그건 질문에 답하지 않고 내가 필요한 것도 아니야
결국 이렇게 된 겁니다.
난 네가 함수를 넘겨줄 수 있다는 걸 알아냈어$scope.$watch
여기서부터 변화를 주시하고 싶은 표현의 값을 반환하는 것은 매우 간단합니다.스코프의 속성에 대한 키 문자열을 전달하는 것과 동일하게 작동합니다.
link: function ($scope, $el, $attrs) {
$scope.$watch(
function () { return $el[0].childNodes.length; },
function (newValue, oldValue) {
if (newValue !== oldValue) {
// code goes here
}
}
);
}
보고 있다childNodes
,것은 아니다.children
왜냐하면childNodes
list에는 텍스트노드 및 코멘트뿐만 아니라 요소도 포함됩니다.Angular는 다음과 같은 지침에 코멘트 자리 표시자를 사용하기 때문에 이 기능은 매우 중요합니다.ng-repeat
,ng-if
,ng-switch
그리고.ng-include
트랜슬루션을 실행하여 DOM을 변경하는 한편,children
요소만 포함됩니다.
요소의 돔에서 더 깊은 곳에 변화가 있는지 관찰할 필요가 있는 경우 MutationObserver를 사용하는 것이 좋습니다.
.directive('myDirective', function() {
return {
...
link: function(scope, element, attrs) {
var observer = new MutationObserver(function(mutations) {
// your code here ...
});
observer.observe(element[0], {
childList: true,
subtree: true
});
}
};
});
이 앵글 돔 이벤트에 대한 지시 모듈을 만들었습니다.
당신의 경우,
<ul class="unstyled" auto-carousel>
<li class="slide" ng-if="name" dom-on-create="nameCreated()">{{name}}</li>
<li class="slide" ng-if="email" dom-on-destroy="emailDestroyed()">{{email}}</li>
</ul>
현재 지원만 가능dom-on-create
그리고.dom-on-destroy
단, $watch 콜백을 반복 체크하는 것이 아니라 각 돔이벤트에 대해1회밖에 기동하지 않기 때문에 허용 응답보다 퍼포먼스가 우수합니다.
angular의 권장사항에는 해당되지 않지만 요소 초기화 시 ng-init을 사용할 수 있습니다.
<ul class="unstyled" auto-carousel>
<li class="slide" ng-if="name" ng-init="recheck()">{{name}}</li>
<li class="slide" ng-if="email" ng-init="recheck()">{{email}}</li>
</ul>
링크 함수 내에서 먼저 지시 내용을 컴파일할 수 있습니다.예를 들어 다음과 같습니다.
angular.module('myApp').directive('autoCarousel', ['$compile', function ($compile) {
return {
templateUrl: 'views/auto-carousel.html',
restrict: 'A',
replace: true,
link: function (scope, element, attr) {
$compile(element.contents())(scope);
// your code goes here
}
}
}]);
언급URL : https://stackoverflow.com/questions/21332671/angularjs-watch-dom-change
'programing' 카테고리의 다른 글
.htaccess를 사용하여 HTTP를 HTTP로 리다이렉트합니다. (0) | 2023.02.25 |
---|---|
Lombok을 사용한 Spring Boot 로깅 (0) | 2023.02.25 |
jq를 사용하여 JSON 문자열을 테이블로 포맷하려면 어떻게 해야 합니까? (0) | 2023.02.25 |
스프링 부트 메이븐 플러그인 클래스를 찾을 수 없습니다. (0) | 2023.02.25 |
디스플레이 시뮬레이션: React Native 인라인 (0) | 2023.02.25 |