【发布时间】:2013-03-22 17:22:02
【问题描述】:
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 )
...带有一些基本的错误预防逻辑。
【问题讨论】:
-
你有没有想过使用类似Sizzle 的东西来代替完整的jQuery? (jQuery 在此内部运行。)
-
我有,在 Angular 采用选择模式之前,这可能是一条路。你会看到我已经更新了帖子,表明我希望它只是在异常点返回一个 document.querySelectorAll 尝试。我的意思是,为什么不呢?这里没有增加臃肿。
-
我还应该注意到,当 Angular 团队在这些情况下推荐 document.querySelectorAll 时,他们背离了他们在此处所倡导的包装全局模式 - docs.angularjs.org/api/ng.$window。
-
querySelectorAll / Sizzle 的事情是...... angular.element 仅设计用于操作单个节点:(
-
我同意 Angular 和所有 JS MVC 的愚蠢(笨拙)本质。我觉得这是 javascript 的固有缺陷的一部分,也是 JS MVC 的起源(很多 Rails 人)。 Java、C、C++、Python、PHP 等(不是 rails)中的很多代码在继承和遍历范围/其他方面都是一致的。我认为我为 JS MVC 编写的大部分 JS 都会让我在其他语言职位上被解雇。无类原型语言似乎就是这样走的。
querySelectorAll是我们目前所拥有的。欢迎反馈。 #thx
标签: javascript angularjs