在许多场景中,需要等待异步的请求完成后对DOM进行操作。例如,在异步获取图片数据后,对图片进行等比缩放。对于DOM的操作通常放置在directive
中,而当数据是异步请求的时候,DOM的数据并未就绪,此时在directive
中去操作时会无法找到数据进而导致操作失败。
考虑对图片进行等比缩放的场景,假定将图片缩放的操作放置在image-resize
的directive
中,图片的src
等待异步请求后才能获取到。HTML代码如下:
|
|
ng-src
绑定到image.src
上,在此数据变化时就可以判定获取图片地址的异步请求已经完成。所以,在image-resize
中通过监视ng-src
这个属性,当变化的时候就进行缩放操作:
|
|
由于对于图片的操作仅需在获取到图片地址后执行一次,所以使用$attributes.$observe
并不是一个上等的方案。如果能在异步执行完成,执行directive
就无需进行监视操作。在AngularJS中,directive
首先会被compile
一次,并在第一次使用的时候进行link
,而第一使用受类似ng-if
等的限定。
也就是说,当一个DOM元素上的ng-if
中表达式为false
时,元素上的其他directive
不会被link
。使用这个特性,以上的代码可以简写:
|
|
同时image-resize
内部对于ngSrc
属性的监视也可以去掉:
|
|
当异步请求完成时,将image.loaded
变量设定为true
,当AngularJS执行下一轮digest
的时候,图片元素上的ng-if
结果为true
,触发resize-image
的link
,此后即可以对图片进行后续的操作。