- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我无法让 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
最佳答案
DynamicComponentLoader 正在弃用(参见 commit )。现在正确的方法是在构造函数中使用 ViewContainerRef
和 ComponentResolver
(请参阅下面的更新 3)作为示例。
在 beta.1 中有一个突破性的变化。您无法再访问构造函数中的 View 。因此,您可以将该示例移至 ngOnInit(),它将起作用。
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)以修复源代码中的示例。所以希望他们会审查它并且它会通过。
自 beta.16 以来,loadIntoLocation
已被删除,错误不再可重现。 loadNextToLocation
现在采用 ViewContainerRef
。我打开了一个新的 PR(参见 #8241)以添加一个新的示例,其他所有内容都已包含在原始 PR 中。
代码示例(更新 3)
如上所述,现在没有 loadIntoLocation
,但使用 ViewContainerRef
和 ComponentResolver
可以实现相同的行为。
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 => {});
}
// 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/
使用任何方法(例如 loadIntoLocation)我可以将指令动态加载到我的基本组件到特定容器中! @Component({ ... template: ` empty div` ...}) 然后
我正在尝试创建一个表组件,该组件将从列描述和原始数据构建一个表。 我能够毫无问题地创建基本功能,但我也希望能够覆盖单个单元格的默认呈现,以便能够显示自定义内容(例如,显示链接)。 以与 DataTab
背景 我有一个代表文件夹列表和文档类别的数据;我通过网络界面从我们的信息管理软件中获取它。从每个项目都有 ParentFolderNo 的原始列表中我用 children: any[] 创建了一个对象
我正在尝试让 loadIntoLocation 正常工作,但我不断收到错误消息, 类型“DynamicComponentLoader”上不存在属性“loadIntoLocation”。 我查看了其他示
我正在尝试使用DynamicComponentLoader,示例代码如下: import {Component, View, bootstrap, OnInit, DynamicComponentL
我正在将 beta.14 的 Angular 2 应用程序升级到 rc.4。 我在@angular/core 中的 DynamicComponentLoader 上收到弃用警告。 要使用的新类是什么?
嘿...我找到了一篇关于使用动态组件加载器和处置方法添加和删除组件的帖子。我想一次销毁所有创建的组件。我有 plunker demo以及我找到演示的来源 Angular 2 - Adding / Re
我正在 RC5 中创建一个 angular2 应用程序,我想在其中动态加载组件。 在 RC1 中,我使用 dynamicComponentLoader 做了同样的事情: @Component({
我不使用 typescript ,而是使用ES6 和angular2 alpha39 来动态加载组件。以下代码类似于我在我的应用程序中的代码。我注意到 angular2 不会创建 DynamicCom
我无法让 Angular 的 DynamicComponentLoader 在 beta.6 中工作 我已经采用了动态组件加载的示例代码 from their docs ,并将其添加到 plnkr,
DynamicContentLoader 文档没有解释如何正确加载子组件的输入。假设我有一个这样的 child : @Component({ selector: 'child-component'
长话短说: works but not dynamic dynamic but doesn't work 解释: 我正在使用 DynamicComponentLoader 动态创建 Angular 2
我正在开发一个 Angular2 应用程序,我遇到了一个问题: 我有一组可以使用 UI 选择的不同对象。每个对象都有一组选项(不同的对象不同),可以使用 UI 进行编辑。现在,我正在使用 Dynami
我是一名优秀的程序员,十分优秀!