找到代码代入口点
|
|
bindJQuery()
|
|
这个方法是用来绑定jQuery的,如果发现window已经绑定了jQuery,就将jQueryt通过extend方法绑定到jqLite上,同时扩展了scope,isolateScope,controller,injector,inheritedData.否则,就使用angular自带的jQLite,最终都赋给angular.element.这也就是我们可以通过angular.element去调用jQuery的方法.
下面看一下这个extend方法:
|
|
关于此处使用hashKey可以看看angularJs git的提交记录:
|
|
在绑定jQuery的时候,通过jqLitePatchJQueryRemove
方法将jQuery原生的remove,empty,html
多做一层处理,处理完后再调用jQuery原生的方法.
|
|
需要注意的是这一个三元表达式:
当传入的filterElems为true并且jQuery原生方法传入参数不为空的时候,list才去取this.filter(param).这种情况会发生在:angular.elment('div').remove('.test')
这种情况下,因为list是始终要得到你选择的那个DOM元素,所以进行这样一个三元判断.
这里备注一个从参考资料上了解的内容:
在这里element.triggerHandler('$destroy')
会告知angular底下的transcludedScope
,这个element已经被摧毁了,所以会导致$element.detach
的时候,transcludedScope
无法被更新.element.triggerHanler('$destroy')
的监听event可以参考createBoundTranscludeFn
这个function,会有下面这段code去监听:
1 clone.on('$destroy', bind(transcludedScope, transcludedScope.$destroy));在
jqLitePatchJQueryRemove
只替换remove
、empty
、html
,而没有替换detach
,使用detach
却会影响scope
,真正原因要找到jquery的source code.
因为detach间接呼叫了remove:
123 detach: function( selector ) {return this.remove( selector, true );}Example(1.2.7):
directive在ready中呼叫$element.deatch:此时
transclude
里面的scope将会失效.directive在ready之前呼叫$element.deatch:
tansclude
尚未被建立,自然而然就不会处理$destroy
的event,transclude
里的scope仍然会work.由此可知,只要scope尚未ready时,呼叫
detach
就不会中断scope的更新.若要让directive
的scope正常运作,可用以下方式:
- 不使用transclude
- 不在scope ready中,使用deatch
- 使用原生api
- 最后一种方式,jquery在angular之后include
如果不是这么需要使用到jquery,建议就不要include了,当然jquery也提供很多方便的功能,依照project需求自己评估吧!