Skip to content
This repository has been archived by the owner on Apr 12, 2024. It is now read-only.
Dean Sofer edited this page May 21, 2013 · 39 revisions

Editors: put 2 spaces at the end of a question to create a <br>

(There's a new Testing section below)

  1. Where can I find good learning resources?
    Learning Resources

  2. How do I access the DOM from a controller?
    DO NOT perform DOM selection/traversal from the controller. The HTML hasn't rendered yet. Look up 'directives'.

  3. Why does angular say my controllers/directives/etc are missing?
    Calling angular.module('myApp', []) will ALWAYS create a new module (and wipe out your existing one). Instead, make sure to call angular.module('myApp') with only 1 parameter to refer to an already created module.

  4. How to render unescaped data?
    You will probably want ng-bind-html-unsafe sooner or later.

  5. How can I watch when an array/object/ngResource query is modified?
    $scope.$watch has a third parameter to monitor changes by value (and not by reference).

  6. Don't try to serialize the form or collect the input values manually. Just slap ng-model="data.myField" onto every form input you use and then take a gander at $scope.data when you finally need it.

  7. Always have a '.' in your ng-models. Misko best practice.

  8. $rootScope is essentially where you put ng-app. You can inject $rootScope into your bootstrap or services to add stuff that should be accessible on all scopes.

  9. The difference between module().factory() and module().service().

  10. Prevent Flash Of Unstyled Content (FOUC) (and curly braces) by mixing ng-bind with ng-cloak.

  11. Nested Routes / Views? Maybe...

  12. You can always do <script id="some/partial.html" type="text/ng-template"> and angular will use it instead!

  13. Escape the port in $resource('example.com\\:8080')

  14. Angular watches the input event, not the 'change' event.

  15. Don't use jQuery to toggle crap. Just use a lot of variable flags inline: <a ng-click="flags.open=!flags.open">...<div ng-class="{active:flags.open}">

  16. If you're on Google Chrome, install the Batarang extension, inspect a DOM element, and type $scope in the console.

  17. Checkout AngularUI for an awesome collection of directives (and even BETTER example code).

  18. For IE v8.0 or earlier you may want to read this and use this.

  19. If you want to get rid of the # in your routes, search the docs for html5mode.

  20. You should try using the AngularUI Passthru Directive (uiJq) before trying to roll your own jQuery plugin wrapper directive.

  21. If you change newVal inside your $scope.$watch it could fire again (recursively?).

  22. You should ONLY use $scope.$apply in non-angular events/callbacks. It usually doesn't belong anywhere else.

  23. Bypass HTML5Mode for <a href> by adding target="_self"

  24. How do I .preventDefault() or .stopPropagation()?
    All ng-click and related bindings inject a $event object that you can call things like .preventDefault() or even pass the object to your methods

  25. AngularJS doesn't work in my Chrome extension!
    You want to use ng-csp

Testing

  1. Rejecting / Resolving a $q.defer() doesn't go through
    You must add a $scope.$apply() for these to process

  2. Jasmine spyOn() is not executing the spy'd function
    Not necessarily an AngularJS question, but you need to append .andCallThrough()

  3. How do I test async code?
    Focus on creating mocks (fake objects / functions) that let you flush the async stuff synchronously. $timeout has a .flush() method specifically for this reason, just remember to add a $scope.$apply() too. If that still doesn't work, look up Jasmine's runs() and waits() functions.