This week I learned that there’s nothing quite like signing up to teach something to make you realize you don’t actually know the material all that well.

I’m giving an introduction to AngularJS talk this Thursday at Startup House SF. You should come by if that sounds like something you’d be interested in.

It’s Tuesday and 124 people have signed up and I’m kind of shvitzing right now. I’ve tried to channel my nervousness into preparation (we’ll see if it pays off or not). Here are a few things I’ve learned in the process.

The difference between $route and $routeProvider

This boils down to the difference between providers and services. Providers are blueprints that create injectable services for your app. $route is the service that $routeProvider creates. $routeProvider gives you the chance to configure itself before it creates $route if you do so in the module.config block. The rules you configure on $routeProvider in your config block become $route.routes.

The only place you can inject providers is into a module.config block. You can’t inject any normal dependencies into module.config because the injector hasn’t been built yet at that point.

The difference between a service, a factory, and a provider

Service: the actual function you give module.service becomes the injectable service.

module.service('Cats', function() {
  this.cats = [];
});

Factory: the object you return from the config function you supply becomes the injectable service.

module.factory('Cats', function() {
  var Cats = {};
  Cats.cats = [];
  return Cats;
});

Provider:

From the below SO answer: “Providers have the advantage that they can be configured during the module configuration phase.” Just like module.factory lets you write a wrapper configuration function around module.service so that it can be dynamically configured at the time of injection, module.provider allows you to write a wrapper function around module.factory so that it can by dynamically configured at the time the app starts (using a module.config block). You define this.$get() on the configuration function, in which you define manually what automatically happens in the background when you use module.factory.

module.provider('Cats', function() {
  var cats = [];
  this.setInitialCats = function(initalCats) {
    cats = [initalCats];
  }

  function Cats(newCats) {
    cats = cats.concat(newCats);
    this.getCats = function() {
      return cats;
    }
  }

  this.$get = function(newCats) {
    return new Cats(newCats);
  };
});

This is summarized from this SO answer.

“If you don’t have a dot in your model, you’re doing it wrong”

I had understood the need to hand ng-model a reference to a property on an object, not a primitive, but this sums it up nicely. Related SO page.

ng-init

Accoriding to the docs, there isn’t much use for this outside of nested ng-repeats. However, for demo purposes, I think it might be useful.