使用gridstack和angular2动态添加组件? Jquery $.parseHTML 不起作用

Posted

技术标签:

【中文标题】使用gridstack和angular2动态添加组件? Jquery $.parseHTML 不起作用【英文标题】:Dynamic add component using gridstack and angular2? Jquery $.parseHTML does not work 【发布时间】:2017-03-11 21:08:21 【问题描述】:

我有以下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 

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

【问题讨论】:

***.com/questions/34784778/… 我不确定我是否理解您想要做什么。目前 gridstack 仅支持 angular 1。 【参考方案1】:

动态添加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 Example 适合您的情况

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

Load existing components dynamically Angular 2 Final Release Equivalent of $compile in Angular 2 How can I use/create dynamic template to compile dynamic Component with Angular 2.0? Angular 2.1.0 create child component on the fly, dynamically How to manually lazy load a module?

【讨论】:

@yuzui 我试过这个例子,我得到 this.componentFactoryResolver.resolveComponentFactory is not a function 错误 @rish 你能提供一些 plunker 吗? @yuzui thnx 回复,plnkr.co/edit/EPYcF3qFEkYhc12WVEeD?p=preview @rish 如果你想用动态 html 创建组件,那么你必须使用Compiler。我更新了你的 plunker plnkr.co/edit/GDyJk0GGPOF5opax5cwX?p=preview 如你所见,我得到了 HtmlElement 并将其添加到 document.body @yuzui thnx 这对我很有帮助,这里只有一个问题,我们可以在没有 [at]Component 和 [at]Directives 的普通类中创建这两个方法吗?【参考方案2】:

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

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

Here's a working plunker example.

或者您可以使用来自this post 的通用 HTML 插座

【讨论】:

有很多 DynamicComoponentLoader 线程,但这些答案不相关,因为它已被弃用。

以上是关于使用gridstack和angular2动态添加组件? Jquery $.parseHTML 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Gridstack 动态创建的小部件不拖动

如何使用指令添加新的 gridstackitem?

如何将 gridstack.js 添加到 Ractive.js?

将苗条组件添加到gridstack

Gridstack - 添加带有内容的新小部件

Angular2:使用DynamicComponentLoader动态插入的组件上的双向数据绑定