angular.element与document.getElementById或jQueryselect器与旋转(繁忙)控制
我正在使用Spin控件的“Angularised”版本,如下所示: http : //blog.xvitcoder.com/adding-a-weel-progress-indicator-to-your-angularjs-application/
我不喜欢的解决scheme之一是在服务中使用jQuery来有效地将旋转控件附加到DOM元素。 我宁愿使用angular构造来访问元素。 我还想避免在服务中对微调器需要附加的元素的id进行“硬编码”,而是使用一个在服务(单例)中设置id的指令,以便服务的其他用户服务本身不需要知道这一点。
我正在挣扎什么angular.element给我们什么document.getElementById在相同的元素ID给我们。 例如。 这工作:
var target = document.getElementById('appBusyIndicator');
这些都不是:
var target = angular.element('#appBusyIndicator'); var target = angular.element('appBusyIndicator');
我明显在做一些相当明显的错误! 任何人都可以帮忙吗?
假设我可以得到上述工作,我有一个类似的问题,试图取代jQuery访问元素:例如$(target).fadeIn('fast');
工作angular.element('#appBusyIndicator').fadeIn('fast')
or angular.element('appBusyIndicator').fadeIn('fast')
不
有人能给我一个很好的例子,说明一个angular度“元素”与DOM元素的使用吗? Angular显然会用自己的属性,方法等来“包装”这个元素,但是通常很难获得原始值。 例如,如果我有一个<input type='number'>
字段,并且当用户键入“ – ”(不带引号),我想访问在ui中可见的原始内容时,我什么也得不到,大概是因为“ type = number“意味着Angular拒绝了input,即使它在UI中是可见的,我也想看到它,所以我可以testing它并清除它。
任何指针/答案表示赞赏。
谢谢。
它可以这样工作:
var myElement = angular.element( document.querySelector( '#some-id' ) );
将Document.querySelector()
本机Javascript调用包装到angular.element()
调用中。 所以你总是得到一个jqLite或jQuery对象的元素,取决于jQuery
是否可用/加载。
angular.element
官方文档:
如果jQuery可用,
angular.element
是jQuery
函数的别名。 如果jQuery不可用,angular.element
委托给Angular的jQuery
内置子集,名为“jQuery lite”或jqLite 。
Angular
中的所有元素引用总是用jQuery或jqLite
(例如指令编译或链接函数中的元素参数)。 他们从来没有原始的DOM
参考。
如果你不知道为什么要使用document.querySelector()
,请阅读这个答案 。
如果您还没有阅读angular度元素文档,那么您应该阅读jqLite所支持的内容,而不是jQueryite是内置于angular中的jquery的一个子集。
这些select器不能单独使用jqLite,因为不支持通过id select器 。
var target = angular.element('#appBusyIndicator'); var target = angular.element('appBusyIndicator');
所以,要么:
- 你只使用jqLite,比jquery更有限,但在大多数情况下是足够的。
- 或者你在你的应用程序中包含完整的jQuery库,并像jquery一样在你真正需要jQuery的地方使用它。
编辑:请注意,jQuery应该在 angularJS 之前加载,以便优先于jqLite:
真正的jQuery总是优先于jqLite,只要它在DOMContentLoaded事件触发之前加载。
编辑2:我错过了之前的问题的第二部分:
与<input type="number">
,我认为这不是一个angular度的问题,这是本机 html5数字元素的预期行为。
即使您尝试使用jquery的.val()
或原始的.value
属性来检索它,也不会返回非数字值。
var target = document.getElementById('appBusyIndicator');
等于
var target = $document[0].getElementById('appBusyIndicator');
我不认为这是使用angular度的正确方法。 如果框架方法不存在,请不要创build它! 这意味着框架(这里angular)不这样工作。
有了angular度,你不应该像这样(jQuery的方式)操纵DOM,而是使用angular度助手,如
<div ng-show="isLoading" class="loader"></div>
或者创build你自己的指令(你自己的DOM组件),以便完全控制它。
顺便说一句,你可以在这里看到http://caniuse.com/#search=queryselector querySelector是很好的支持,所以可以安全地使用。
您应该在控制器中注入$ document,并使用它来代替原始文档对象。
var myElement = angular.element($document[0].querySelector('#MyID'))
如果你不需要jquery样式的元素包装,$ document [0] .querySelector('#MyID')会给你DOM对象。
你可以使用$ document($ document需要注入)来访问元素,
var target = $document('#appBusyIndicator'); var target = $document('appBusyIndicator');
或者使用angular元素,指定的元素可以被访问为:
var targets = angular.element(document).find('div'); //array of all div var targets = angular.element(document).find('p'); var target = angular.element(document).find('#appBusyIndicator');
如果有人使用gulp,它会显示一个错误,如果我们使用document.getElementById()
,它build议使用$document.getElementById()
但它不起作用。
使用 –
$document[0].getElementById('id')
这对我很好。
angular.forEach(element.find('div'), function(node) { if(node.id == 'someid'){ //do something } if(node.className == 'someclass'){ //do something } });
也许我在这里太晚了,但这将工作:
var target = angular.element(appBusyIndicator);
注意,没有appBusyIndicator
,它是普通的ID值。
在幕后发生了什么:(假设它应用在div上)(从angular.js行号:2769开始…)
///////////////////////////////////////////// function JQLite(element) { //element = div#appBusyIndicator if (element instanceof JQLite) { return element; } var argIsString; if (isString(element)) { element = trim(element); argIsString = true; } if (!(this instanceof JQLite)) { if (argIsString && element.charAt(0) != '<') { throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element'); } return new JQLite(element); }
默认情况下,如果页面上没有jQuery,将使用jqLite。 该参数被内部理解为一个id,并返回相应的jQuery对象。
改进kaiser的答案:
var myEl = $document.find('#some-id');
不要忘记注入$document
到您的指令