AngularJS 没有内置的 DOM 选择引擎,但提供了一些实用方法来处理 jQuery 为典型应用程序提供的部分功能。
但是,DOM 选择仍然是王道,我正试图将 jQuery 排除在我的应用程序之外,仅出于 DOM 选择的目的。
Angular 提供了 $document 服务作为可注入对象。我觉得这很麻烦。例如,要使用 $document 实现本机 DOM 选择,您需要将 $document 注入所需的所有指令并调用 querySelectorAll,然后使用 Angular 扩展它:
angular.element( $document[0].querySelectorAll('#element') )
这很愚蠢。
在此期间,我为自己提供了一个全局助手,但它不使用 Angular 的包装 $document...
// Create a shortcut to querySelectorAll
window.query = function(selector) {
return document.querySelectorAll( selector )
}
// For use inside a directive like so...
angular.element( query('#element') )
AngularJS 对全局变量过敏,并为保护和可测试性包装了全局变量。有没有一种干净的方法可以利用 querySelectAll 而无需将 $document 传递到每个指令中?我可以以与 jQuery 相同的方式扩展 angular.element 但使用 querySelectorAll 吗?
编辑:
我还想注意原始 JQLite 库支持基本选择器https://code.google.com/p/jqlite/wiki/UsingJQLite#Supported_Selectors。
然而,AngularJS 实现不支持选择器,也似乎没有提到这个功能遗漏 - http://docs.angularjs.org/api/angular.element
相反,AngularJS 会:
throw Error('selectors not implemented');
^ 当传递给 angular.element 的项目是不以“<”开头的字符串时。
如果是这样就好了:
return document.querySelectorAll( element )
...带有一些基本的错误预防逻辑。