16

我有以下jsfiddle

我希望能够将我的自定义组件粘贴到特定的网格中(例如“”)

现在没有 Angular2,我只使用:

var el = $.parseHTML("<div><div class=\"grid-stack-item-content\" data-id=\""+id+"\"/><div/>");
this.grid.add_widget(el, 0, 0, 6, 5, true);

问题是,我不知道我该怎么做:

var el = $.parseAndCompileHTMLWithComponent("<div><div class=\"grid-stack-item-content\" data-id=\""+id+"\"/><fancy-button></fancy-button><div/>");
this.grid.add_widget(el, 0, 0, 6, 5, true);

在 angular1 中,我知道有编译,但在 angular2 中,没有这样的东西。

我的花式按钮组件很简单,如下所示:

@Component({
  selector: 'fancy-button',
  template: `<button>clickme</button>`
})
export class FancyButton {}

如何动态添加花式按钮组件?

4

2 回答 2

5

动态添加fancy-button组件的简单方法可能如下:

1)将组件添加到entryComponents模块数组

@NgModule({
  imports:      [ BrowserModule ],
  declarations: [ AppComponent, GridStackComponent, FancyButtonComponent ],
  entryComponents: [ FancyButtonComponent ], // <== here
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

2)从编译的组件中获取根节点

constructor(private vcRef: ViewContainerRef, private componentFactoryResolver: ComponentFactoryResolver) { }

getRootNodeFromParsedComponent(component) {
  const componentFactory = this.componentFactoryResolver.resolveComponentFactory(component);
  const ref = this.vcRef.createComponent(componentFactory, this.vcRef.length, this.vcRef.injector);
  const hostView = <EmbeddedViewRef<any>>ref.hostView;
  return hostView.rootNodes[0];
}

3)在任何地方使用它

const fancyBoxElement = this.getRootNodeFromParsedComponent(FancyBoxComponent);  
$('#someId').append(fancyBoxElement);

这是您的案例的Plunker 示例

如果您正在寻找更复杂的东西,那么有很多答案可以使用角度编译器来完成它

于 2016-11-06T07:26:57.047 回答
1

您需要使用 Angular 2 的 ViewContainerRef 类,它提供了一个方便的 createComponent 方法。ViewContainerRef 可以非正式地认为是 DOM 中可以插入新组件的位置。

this.cmpRef = this.vcRef.createComponent(factory, 0, injector, []);

这是一个有效的 plunker 示例

或者您可以使用这篇文章中的通用 HTML 出口

于 2016-11-01T14:46:07.630 回答