Potential bug in registerComponent #14391
Description
Description
Bug exists on angular 1.5.3 and even on master branch.
In compile.js at the beginning of registerComponent (angular.component) method there is a assignment:
var controller = options.controller || noop;
Some lines later (after factory function definition) the controller
variable is modified by assigning component options starting with $
sign.
forEach(options, function(val, key) {
if (key.charAt(0) === '$') {
factory[key] = val;
// Don't try to copy over annotations to named controller
if (isFunction(controller)) controller[key] = val;
}
});
This may modify an angular method noop
if component doesn't have a controller, which should not have happened.
How I found it?
I came across this problem using ngComponentRouter 2.0.0 with Angular 1.5.3 when I had two components without controllers defined. In this situation when factory function is executed, the default controller (noop) has $routeConfig property from the later one defined component (because registerComponent modify the same object: noop
function). Result: ngComponentRouter couldn't find properly defined route.
Fix proposal
Probably the fix is fairly simple. Use function() {}
instead of noop
:
var controller = options.controller || function() {};
This will guarantee new function object at any situation.