Skip to content
This repository has been archived by the owner on Apr 12, 2024. It is now read-only.

Potential bug in registerComponent #14391

Closed
rszachtsznajder opened this issue Apr 7, 2016 · 0 comments
Closed

Potential bug in registerComponent #14391

rszachtsznajder opened this issue Apr 7, 2016 · 0 comments

Comments

@rszachtsznajder
Copy link

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.

@gkalpak gkalpak added this to the 1.5.4 milestone Apr 8, 2016
gkalpak added a commit to gkalpak/angular.js that referenced this issue Apr 9, 2016
Currently, custom annotations are copied from the CDO onto the controller constructor.
Using `noop()` when no controller has been specified, pollutes it with custom annotations and
makes one component's annotations available to all other components that have `noop()` as their
controller.

Fixes angular#14391
petebacondarwin pushed a commit that referenced this issue Apr 11, 2016
Currently, custom annotations are copied from the CDO onto the controller constructor.
Using `noop()` when no controller has been specified, pollutes it with custom annotations and
makes one component's annotations available to all other components that have `noop()` as their
controller.

Fixes #14391
Closes #14402
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.