我有一个执行DOM操作的指令。它的链接函数似乎被调用了两次,一次是在模板渲染良好之前,一次是在模板渲染得足够好以至于链接函数可以有意义地使用它。
在这种情况下,它调用链接函数两次实际上是有帮助的。另外,调用堆栈是不同的(见下文),因此Angular可能会检测链接函数是否需要延迟,但我不明白如何在不修改jQuery的情况下(因为我的链接函数没有任何$ watch或其他Angular方法。)
有关于此的任何文件吗?我想以这样一种方式改变链接函数:它不是幂等的,当前情况会有问题(调用它会对服务造成不利影响)。
首先是栈跟踪:
(anonymous function) (resizable.direc…e.client.js:27)
nodeLinkFn (angular.js:6752)
compositeLinkFn (angular.js:6146)
nodeLinkFn (angular.js:6746)
(anonymous function) (angular.js:6954)
(anonymous function) (angular.js:8171)
deferred.promise.then.wrappedCallback (angular.js:11682)
(anonymous function) (angular.js:11768)
$get.Scope.$eval (angular.js:12811)
$get.Scope.$digest (angular.js:12623)
$get.Scope.$apply (angular.js:12915)
done (angular.js:8450)
completeRequest (angular.js:8664)
xhr.onreadystatechange (angular.js:8603)
XMLHttpRequest.send (async)
(anonymous function) (angular.js:8632)
sendReq (angular.js:8426)
$get.serverRequest (angular.js:8146)
deferred.promise.then.wrappedCallback (angular.js:11682)
(anonymous function) (angular.js:11768)
$get.Scope.$eval (angular.js:12811)
$get.Scope.$digest (angular.js:12623)
$get.Scope.$apply (angular.js:12915)
done (angular.js:8450)
completeRequest (angular.js:8664)
xhr.onreadystatechange (angular.js:8603)
XMLHttpRequest.send (async)
(anonymous function) (angular.js:8632)
sendReq (angular.js:8426)
$get.serverRequest (angular.js:8146)
deferred.promise.then.wrappedCallback (angular.js:11682)
(anonymous function) (angular.js:11768)
$get.Scope.$eval (angular.js:12811)
$get.Scope.$digest (angular.js:12623)
$get.Scope.$apply (angular.js:12915)
(anonymous function) (angular.js:14426)
completeOutstandingRequest (angular.js:4411)
(anonymous function) (angular.js:4725)
setTimeout (async)
self.defer (angular.js:4723)
timeout (angular.js:14415)
(anonymous function) (auth.client.service.js:163)
deferred.promise.then.wrappedCallback (angular.js:11682)
(anonymous function) (angular.js:11768)
$get.Scope.$eval (angular.js:12811)
$get.Scope.$digest (angular.js:12623)
$get.Scope.$apply (angular.js:12915)
done (angular.js:8450)
completeRequest (angular.js:8664)
xhr.onreadystatechange (angular.js:8603)
XMLHttpRequest.send (async)
(anonymous function) (angular.js:8632)
sendReq (angular.js:8426)
$get.serverRequest (angular.js:8146)
deferred.promise.then.wrappedCallback (angular.js:11682)
(anonymous function) (angular.js:11768)
$get.Scope.$eval (angular.js:12811)
$get.Scope.$digest (angular.js:12623)
$get.Scope.$apply (angular.js:12915)
done (angular.js:8450)
completeRequest (angular.js:8664)
xhr.onreadystatechange (angular.js:8603)
第二个堆栈跟踪
(anonymous function) (resizable.direc…e.client.js:27)
nodeLinkFn (angular.js:6752)
compositeLinkFn (angular.js:6146)
nodeLinkFn (angular.js:6746)
delayedNodeLinkFn (angular.js:6974)
compositeLinkFn (angular.js:6146)
publicLinkFn (angular.js:6042)
$get.boundTranscludeFn (angular.js:6166)
controllersBoundTransclude (angular.js:6773)
ngDirective.link (angular.js:21409)
nodeLinkFn (angular.js:6752)
compositeLinkFn (angular.js:6146)
publicLinkFn (angular.js:6042)
$get.boundTranscludeFn (angular.js:6166)
controllersBoundTransclude (angular.js:6773)
ngIfWatchAction (angular.js:19772)
$get.Scope.$digest (angular.js:12650)
$get.Scope.$apply (angular.js:12915)
(anonymous function) (angular.js:14426)
completeOutstandingRequest (angular.js:4411)
(anonymous function) (angular.js:4725)
setTimeout (async)
self.defer (angular.js:4723)
timeout (angular.js:14415)
(anonymous function) (drive.controller.client.js:98)
deferred.promise.then.wrappedCallback (angular.js:11682)
(anonymous function) (angular.js:11768)
$get.Scope.$eval (angular.js:12811)
$get.Scope.$digest (angular.js:12623)
$get.Scope.$apply (angular.js:12915)
done (angular.js:8450)
completeRequest (angular.js:8664)
xhr.onreadystatechange (angular.js:8603)
XMLHttpRequest.send (async)
(anonymous function) (angular.js:8632)
sendReq (angular.js:8426)
$get.serverRequest (angular.js:8146)
deferred.promise.then.wrappedCallback (angular.js:11682)
(anonymous function) (angular.js:11768)
$get.Scope.$eval (angular.js:12811)
$get.Scope.$digest (angular.js:12623)
$get.Scope.$apply (angular.js:12915)
done (angular.js:8450)
completeRequest (angular.js:8664)
xhr.onreadystatechange (angular.js:8603)
XMLHttpRequest.send (async)
(anonymous function) (angular.js:8632)
sendReq (angular.js:8426)
$get.serverRequest (angular.js:8146)
deferred.promise.then.wrappedCallback (angular.js:11682)
(anonymous function) (angular.js:11768)
$get.Scope.$eval (angular.js:12811)
$get.Scope.$digest (angular.js:12623)
$get.Scope.$apply (angular.js:12915)
(anonymous function) (angular.js:14426)
completeOutstandingRequest (angular.js:4411)
(anonymous function) (angular.js:4725)
setTimeout (async)
self.defer (angular.js:4723)
timeout (angular.js:14415)
(anonymous function) (auth.client.service.js:163)
deferred.promise.then.wrappedCallback (angular.js:11682)
(anonymous function) (angular.js:11768)
$get.Scope.$eval (angular.js:12811)
$get.Scope.$digest (angular.js:12623)
$get.Scope.$apply (angular.js:12915)
done (angular.js:8450)
completeRequest (angular.js:8664)
xhr.onreadystatechange (angular.js:8603)
编辑:我弄清楚为什么链接功能可能被调用两次。第一次调用时,它的元素实际上并不在DOM树的任何地方,因为它是ng的子元素 - 如果它当前是假的。第二次调用它的元素实际上是插入到DOM树中的。奇怪的是DOM元素(链接函数中的元素[0])在调用之间是不同的。我仍然找不到任何文档或理解为什么ngIf编译其子树指令,如果它们实际上不在DOM中。