ng-metadata icon indicating copy to clipboard operation
ng-metadata copied to clipboard

Component inheritance and @ViewChildren or @ContentChildren: "Uncaught Error: useExisting is unimplemented"

Open giancarlo-dm opened this issue 7 years ago • 0 comments

Hello,

First I appreciate the hardwork you guys had put on this project.

The problem:

I was trying to implement a use case similar to this stackoverflow question, but when I tried to use the provider declaration: providers: [{provide: BaseComponent, useExisting: forwardRef(() => ChildComponent2) }], I got the following error on the console:

Uncaught Error: useExisting is unimplemented
    at resolveReflectiveProvider (modules.js?hash=30556e0263a3949b7bc00058f573ce0b4384bd92:62054)
    at modules.js?hash=30556e0263a3949b7bc00058f573ce0b4384bd92:62121
    at Array.forEach (<anonymous>)
    at Object._normalizeProviders (modules.js?hash=30556e0263a3949b7bc00058f573ce0b4384bd92:62111)
    at _bundleComponent (modules.js?hash=30556e0263a3949b7bc00058f573ce0b4384bd92:62379)
    at modules.js?hash=30556e0263a3949b7bc00058f573ce0b4384bd92:62402
    at Array.forEach (<anonymous>)
    at bundle (modules.js?hash=30556e0263a3949b7bc00058f573ce0b4384bd92:62401)
    at modules.js?hash=30556e0263a3949b7bc00058f573ce0b4384bd92:62429
    at Array.forEach (<anonymous>)

So I browsered the source code and found this at src/core/di/reflective_provider.ts:

if (provider.useExisting) {
    const [name,value] = provide( provider.useExisting );
    const method = 'factory';

    throw new Error('useExisting is unimplemented');
    // target = (v) => v;
    // annotate(target, 'factory', {name});
    // annotate(target, 'inject', [toInjectorName(provider.useExisting)]);
  }

The questions:

Was it too hard to backport this functionality or it was just forgotten to implement?

Is there an workaround (or correct way of doing this), that is similar to the stackoverflow example I gave?

giancarlo-dm avatar Apr 11 '18 23:04 giancarlo-dm