上一节我们学习了配置一个组件的依赖项的两种方式,以及配置一个属性组件;今天我们来学习didi
框架的另外一些功能,我们先看看代码:
const {Injector} = require('didi');
function bar(baz, abc) {
return {
baz: baz,
abc: abc
};
}
bar.$inject = [ 'baz', 'abc' ];
const module1 = /** @type ModuleDeclaration */ ({
baz: [ 'value', 'baz-value' ],
abc: [ 'value', 'abc-value' ]
});
const injector = new Injector([ module1 ]);
const result = injector.invoke(bar);
console.log('result:',result);
输出如下:

从这里看出,调用invoke方法可以获取某个组件的返回值,比如这里bar
组件返回的一个对象,并且得到组件的依赖项。
我们再来看看另一种使用方式:
const {Injector} = require('didi');
function bar1(a, b) {
return {
baz: a,
abc: b
};
}
const module1 = /** @type ModuleDeclaration */ ({
baz: [ 'value', 'baz-value' ],
abc: [ 'value', 'abc-value' ]
});
const injector1 = new Injector([ module1 ]);
const result1 = injector1.invoke(['baz','abc', bar1]);
console.log('result1:',result1);
输出如下:

从这里可以看出,invoke方法还可以调用一个数组式依赖的对象,这里的本质上就是配置一个组件的依赖项。
我们再看看invoke
方法用默认的组件替换模块的组件:
const {Injector} = require('didi');
class FooType {
constructor() {
throw new Error('foo broken');
}
}
const injector = new Injector([
{
foo: [ 'type', FooType ]
}
]);
const annotatedFn = [ 'foo', 'bar', function(foo, bar) {
console.log('foo local:',foo);
console.log('bar local:',bar);
}];
injector.invoke(annotatedFn, null, { foo: 'FOO', bar: undefined });
我们看输出:

可以看出,invoke的第三个参数传入的组件作为依赖项传入到了annotatedFn
组件中,因此,这是一个用外部组件替换模块组件的方法。