There are a few points in “AngularJS: The Bad Parts” I’d be happy to debate, but let’s focus on “Bad Idea #4”, talking about controller constructor functions:
That’s right, these constructors never create new instances. They are “applied” to a scope object.
Let’s use the following example. A simple controller that is setup to use controller as syntax from the view.
var module = angular.module("app", []);
var MainController = function() {
this.message = "Hello";
this.changeMessage = function() {
this.message = "Bonjour!";
};
this.isMainController = function(object) {
return object instanceof MainController;
};
this.isObject = function(object) {
return object instanceof Object;
};
};
module.controller("MainController", MainController);
If we place the following markup in a view:
<div>
{{ main.isMainController(main) }}
{{ main.isObject(main) }}
</div>
.. we’ll see the output true and true. The first true is a good indication that Angular does use the controller function as a constructor function, in other words, Angular invokes the function using the new keyword. In fact, we can even rewrite a controller using the everyday constructor function and prototype object approach of JavaScript, and everything just works.
var MainController = function() {
this.message = "Hello";
};
MainController.prototype = {
changeMessage: function() {
this.message = "Bonjour!";
},
isMainController: function(object) {
return object instanceof MainController;
},
isObject: function(object) {
return object instanceof Object;
}
};
The above is actually a good example of why I like working with Angular. You can write plain, simple JavaScript objects using established conventions and terminology, then plug the objects into Angular to achieve a goal. There is no magic required or intrusions from the framework. You can even start writing controllers using ES 6 class syntax, but that’s a topic for a future post.
OdeToCode by K. Scott Allen