gpt4 book ai didi

angular - Angular2 beta : "no component directive at element" 中的 DynamicComponentLoader

转载 作者:太空狗 更新时间:2023-10-29 17:16:57 26 4
gpt4 key购买 nike

我无法让 Angular 的 DynamicComponentLoader 在 beta.6 中工作

我已经采用了动态组件加载的示例代码 from their docs ,并将其添加到 plnkr, see here 中的工作起始代码中.

代码如下:

import {Component, DynamicComponentLoader, ElementRef} from 'angular2/core';


@Component({
selector: 'child-component',
template: 'Child'
})
class ChildComponent {
}


@Component({
selector: 'my-app',
template: '<h1>My First Angular 2 App</h1><div #child></div>'
})
export class AppComponent {
constructor(dcl: DynamicComponentLoader, elementRef: ElementRef) {
dcl.loadIntoLocation(ChildComponent, elementRef, 'child');
}
}

这里是堆栈跟踪,它说:“元素上没有组件指令”:

EXCEPTION: Error during instantiation of AppComponent!.BrowserDomAdapter.logError @ angular2.dev.js:23083
angular2.dev.js:23083 ORIGINAL EXCEPTION: There is no component directive at element [object Object]BrowserDomAdapter.logError @ angular2.dev.js:23083
angular2.dev.js:23083 ORIGINAL STACKTRACE:BrowserDomAdapter.logError @ angular2.dev.js:23083
angular2.dev.js:23083 Error: There is no component directive at element [object Object]
at new BaseException (angular2.dev.js:7351)
at AppViewManager_.getNamedElementInComponentView (angular2.dev.js:6441)
at DynamicComponentLoader_.loadIntoLocation (angular2.dev.js:12375)
at new AppComponent (run.plnkr.co/mk31ybnwEtsiX31r/app/app.component.ts!transpiled:33)
at angular2.dev.js:1420
at Injector._instantiate (angular2.dev.js:11459)
at Injector._instantiateProvider (angular2.dev.js:11395)
at Injector._new (angular2.dev.js:11385)
at InjectorInlineStrategy.instantiateProvider (angular2.dev.js:11149)
at ElementDirectiveInlineStrategy.init (angular2.dev.js:9081)BrowserDomAdapter.logError @ angular2.dev.js:23083
angular2.dev.js:23083 ERROR CONTEXT:BrowserDomAdapter.logError @ angular2.dev.js:23083
angular2.dev.js:23083 _ContextcomponentElement: nullelement: my-appinjector: Injector__proto__: _ContextBrowserDomAdapter.logError @ angular2.dev.js:23083
angular2-polyfills.js:1152 DEPRECATION WARNING: 'dequeueTask' is no longer supported and will be removed in next major release. Use removeTask/removeRepeatingTask/removeMicroTask

最佳答案

更新 4(和最终版本)

DynamicComponentLoader 正在弃用(参见 commit )。现在正确的方法是在构造函数中使用 ViewContainerRefComponentResolver(请参阅下面的更新 3)作为示例。



在 beta.1 中有一个突破性的变化。您无法再访问构造函数中的 View 。因此,您可以将该示例移至 ngOnInit(),它将起作用。

引自changelog

Component view is not yet created when component constructor is called. -> use onInit lifecycle callback to access the view of a component

export class AppComponent { 
constructor(private dcl: DynamicComponentLoader, private elementRef: ElementRef) {

}
ngOnInit() {
this.dcl.loadIntoLocation(ChildComponent, this.elementRef, 'child');
}
}

检查这个plnkr以您的示例工作。

更新

仅供引用,我已发送 PR(请参阅 #7186)以修复源代码中的示例。所以希望他们会审查它并且它会通过。

更新2

自 beta.16 以来,loadIntoLocation 已被删除,错误不再可重现。 loadNextToLocation 现在采用 ViewContainerRef。我打开了一个新的 PR(参见 #8241)以添加一个新的示例,其他所有内容都已包含在原始 PR 中。

代码示例(更新 3)

如上所述,现在没有 loadIntoLocation,但使用 ViewContainerRefComponentResolver 可以实现相同的行为。

constructor(cmpResolver: ComponentResolver, viewContainer: ViewContainerRef) {

cmpResolver.resolveComponent(MyComponent)
.then((factory: ComponentFactory) => {
viewContainer.createComponent(factory, 0, viewContainer.injector)
});
}

引用

关于loadNextToLocation,有两种方式,都是使用ViewContainerRef

  • 使用元素本身的 ViewContainerRef
constructor(private dcl: DynamicComponentLoader, viewContainer: ViewContainerRef) {
dcl.loadNextToLocation(MyComponent, viewContainer).then(ref => {});
}
  • 在 View 中使用一些元素
// Assume the next view
template : '<div #container></div>';

class MyClass {
@ViewChild('container', {read: ViewContainerRef}) container : ViewContainerRef;

constructor(private dcl: DynamicComponentLoader) {}

ngAfterViewInit() {
this.dcl.loadNextToLocation(MyDynamicCmp, this.container).then(ref => {});
}
}

A plnkr上面的例子。

关于angular - Angular2 beta : "no component directive at element" 中的 DynamicComponentLoader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35508458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com