Angular 2+中的依赖注入是否昂贵?

时间:2017-06-30 09:55:51

标签: javascript angular dependency-injection

考虑以下示例:

def getMayaWindow():
    ptr = apiUI.MQtUtil.mainWindow()
    if ptr is not None:
        return shiboken.wrapInstance(long(ptr), QtGui.QMainWindow)

class pipeWindow(formClass,baseClass):
    def __init__(self, parent=getMayaWindow()):
        super(pipeWindow,self).__init__(parent) 

        self.setupUi(self)
        self.setObjectName('pipe_window')

        try:
            cmds.deleteUI('dockPane')
        except:
            pass                
        self.pane = cmds.paneLayout('dockPane', cn='single')

        if 'pipeDock' not in cmds.lsUI(ctl=1) :
            cmds.dockControl('pipeDock', con=self.pane, area='right', 
                              allowedArea = ['right','left'], label = 
                             "ANMD_Pipeline", w=365)            
        else:
            pass
        cmds.control( 'pipe_window', e=True, p=self.pane)

模板中的用法:

@Directive({
    selector: '[testActiveTab]'
})
export class ActiveTabDirective {

    @Input('testActiveTab') active: boolean = true;

    constructor(
        private parent: TabbedContainerComponent, // <--
        private child: TabComponent               // <--
    ) {
    }

    // ...

}

正如您可能已经猜到的那样,此指令用于标记选项卡式容器组件中的活动选项卡。

然而,可能的问题是,每次创建<test-tabbed-container> <test-tab> <!-- ... --> </test-tab> <test-tab testActiveTab> <!-- ... --> </test-tab> </test-tabbed-container> 的实例时,注入器都会重新播种ActiveTabDirectiveparent属性,这意味着如果容器中有child个标签,则n初始化将会发生

问题:

依赖注入在Angular2 +中是一项昂贵的操作吗?或者只是通过参考,因此便宜?

1 个答案:

答案 0 :(得分:2)

昂贵&#39;这里解决了hierarchical dependency injection在Angular中的工作方式,性能影响就是结果。

DI无法实例化并注入未与编译元素链接的组件。

提供者是单身人士(在当前注射器的范围内)。如果未在当前注入器中定义提供程序但在父注入器中实例化,则会注入现有提供程序实例。

尽管InjectableDirectiveComponent类都是可注射的,但Angular明确区分了指令/组件(在declarations中定义)与常规提供者(在{{1中定义) }},并且他们的行为不同。指令/组件由编译器实例化,因此不能意外注入额外的实例。

providers

将注入现有的组件实例,如果没有,则抛出。在哪里&#39;孩子&#39;实际上是自我&#39;因为儿童尚未编译,如有必要,应使用constructor( private parent: TabbedContainerComponent, private child: TabComponent ) {} ViewChild进行检索。