【问题标题】:AngularJS DOM / document selections without jQueryAngularJS DOM / 没有 jQuery 的文档选择
【发布时间】: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


【解决方案1】:

$document 是一个包装器,是的。也许 Angular 的作者之一可以证实这一点,但我认为它并不是要注入指令中。 $window 也不是。它仅适用于需要在ControllerService 中处理$window$document 的罕见情况和情况。

当您在指令中时,将假定 DOM。因此,如果您愿意,可以直接使用documentwindow

Angular 的设计方式,你不需要复杂的选择器。如果您正在做一个复杂的选择(甚至在指令内部),可能有一种更简单的方法可以做到这一点。请注意,该指令使您可以直接访问它所附加的元素。现在您应该主要关注元素周围的元素,可能是兄弟元素或直接子元素。如果您正在寻找其他地方的节点,那么这是“气味”的第一个迹象。

如果您可以让我们知道您想要实现的目标,那么有人可以向您推荐一个可以很好地解决问题的解决方案。

【讨论】:

  • 有趣的点。我发现最常见的场景是将元素(例如样式表)从各种指令注入到 标记中。我看到我在其他情况下可以使用 ng-class 指令等进行更精细的处理。也许我一直在思考应该如何在 Angular 意义上使用 $document/$window。当然很想听听 Angular 人的意见。
  • 这感觉很奇怪......但我现在已经向 元素添加了一个指令......整洁。
猜你喜欢
  • 2014-04-21
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 2010-11-01
  • 2015-02-22
  • 2015-03-11
  • 2015-03-14
  • 2018-08-16
相关资源
最近更新 更多