I'm using the "Angularised" version of the Spin control, as documented here: http://blog.xvitcoder.com/adding-a-weel-progress-indicator-to-your-angularjs-application/
One of the things I don't like about the shown solution is the use of jQuery in the service that effectively attaches the spin control to the DOM element. I would prefer to use angular constructs to access the element. I'd also like to avoid "hard-coding" the id of the element that the spinner needs to attach to within the service and instead use a directive that sets the id in the service (singleton) so that other users of the service or the service itself don't need to know that.
I'm struggling with what angular.element gives us vs what document.getElementById on the same element id gives us. eg. This works:
var target = document.getElementById('appBusyIndicator');
None of these do:
var target = angular.element('#appBusyIndicator');
var target = angular.element('appBusyIndicator');
I'm clearly doing something that should be fairly obvious wrong! Can any one help?
Assuming I can get the above working, I have a similar problem with trying to replace jQuery access to the element:
eg $(target).fadeIn('fast');
works
angular.element('#appBusyIndicator').fadeIn('fast')
or angular.element('appBusyIndicator').fadeIn('fast')
doesn't
Can someone point me to a good example of documentation that clarifies use of an Angular "element" vs the DOM element? Angular obviously "wraps" the element with its own properties, methods etc but it's often hard to get the original value. For example if I have an <input type='number'>
field and I want to access the original contents that are visible in the ui when the user types "--" (without the quotes) I get nothing, presumably because the "type=number" means Angular is rejecting the input even though it's visible in the UI and I want to see it so I can test for it and clear it down.
Any pointers/answers appreciated.
Thanks.
Maybe I am too late here but this will work :
Notice, there is no
appBusyIndicator
, it is plain ID value.What is happening behind the scenes: (assuming it's applied on a div) (taken from angular.js line no : 2769 onwards...)
By default if there is no jQuery on the page, jqLite will be used. The argument is internally understood as an id and corresponding jQuery object is returned.
You should read the angular element docs if you haven't yet, so you can understand what is supported by jqLite and what not -jqlite is a subset of jquery built into angular.
Those selectors won't work with jqLite alone, since selectors by id are not supported.
So, either :
Edit: Note that jQuery should be loaded before angularJS in order to take precedence over jqLite:
Edit2: I missed the second part of the question before:
The issue with
<input type="number">
, I think it is not an angular issue, it is the intended behaviour of the native html5 number element.It won't return a non-numeric value even if you try to retrieve it with jquery's
.val()
or with the raw.value
attribute.It can work like that:
You wrap the
Document.querySelector()
native Javascript call into theangular.element()
call. So you always get the element in a jqLite or jQuery object, depending whether or notjQuery
is available/loaded.Official documentation for
angular.element
:In case you do wonder why to use
document.querySelector()
, please read this answer.is equal to