templatURL中的动态模板,角度为2

时间:2015-11-17 05:46:33

标签: javascript angular

每当我必须在页面中动态包含一个模板时,我一直在使用角度1中的ng-include。

现在如何在角度2中实现这一点。我试过搜索并找到了这些:

https://groups.google.com/forum/#!topic/angular/ROkKDHboWoA

https://github.com/angular/angular/issues/2753

有人可以解释如何在angular2中执行此操作,因为链接说由于某些安全原因而不包括ng-include。

或至少如何在templateUrl属性中使用可验证的值,以便可以在服务器端处理可验证值以提供模板...

5 个答案:

答案 0 :(得分:11)

正如你在Angular回购的issue中看到的那样,很可能我们不会得到那个指令。我们是否需要这个指令已经进行了长时间的讨论,如果没有提供我们如何通过自己实现它。

我试图举例说明如何实现它。

Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    If ComboBox1.SelectedIndex = 0 Then
        Dim dbprovider As String = "PROVIDER = Microsoft.ACE.OleDb.12.0;"
        Dim dbsource As String = "DATA SOURCE = \\Mac\Home\Desktop\Dalangs\Database De Empleados.accdb"
        DataGridView1.Show()
        DataGridView2.Hide()
        con.ConnectionString = dbprovider & dbsource
        con.Open()
        da.GetFillParameters()
        con2.Close()
        MsgBox("Employees successfully loaded")

    ElseIf ComboBox1.SelectedIndex = 1 Then
    Dim dbprovider As String = "PROVIDER = Microsoft.ACE.OleDb.12.0;"
    Dim dbsource As String = "DATA SOURCE = \\Mac\Home\Desktop\Dalangs\Database De Clientes.accdb"
    DataGridView2.Show()
    DataGridView1.Hide()
        con2.ConnectionString = dbprovider & dbsource
        con2.Open()
        da2.GetFillParameters()
    con.Close()
    MsgBox("Clients successfully loaded")

    End If
    Button4.Visible = True
End Sub

要进行演示检查,请Plunker

答案 1 :(得分:3)

实际上,角度2在当前构建中没有这个特征。另外,根据添加的链接,我认为不会包含此功能。

可以使用一段使用ajax调用动态添加模板的JavaScript。

或者将来可能会使用动态模板加载器库。

答案 2 :(得分:1)

alpha.46 (和ES6 JS):

文件导入文件中,您想要包含:

@Component({
  selector: 'account'
})
@View({
  templateUrl: './folder/containing/template.html'
})

这很容易。

如果您要导入组件,则可以在文件中执行此操作:

import ComponentClassName from './folder/with/componentName';

...

@View({
  directives: [ComponentClassName]
})

/ component:

的导入文件中

定义您的ComponentClassName(您可以将templateUrl添加到@View,正如顶部所示。

不要忘记文件底部的export default ComponentClassName;

Angular 2官方文档中的示例并不多,但您偶然发现了every once in a while

答案 3 :(得分:1)

正如@binariedMe准确描述的那样,出于安全考虑,ng-include在Angular 2中已关闭。推荐的方法是使用自定义指令,稍微增加程序开销。

此外,准备2.0的Angular代码:

myApp.directive('myInclude', function() {
    return {
        templateUrl: 'mytemplate.html'
    };
});

而不是在元素上使用ng-include,只需添加my-include

<div my-include></div>

答案 4 :(得分:0)

关注@binariedMe和此博客文章http://blog.lacolaco.net/post/dynamic-component-creation-in-angular-2/,我能够构建一个可能适合您的解决方案。使用AJAX调用并从返回的html内容动态创建自定义组件应该在创建新的my-ng-include自定义指令时解决此问题。

import {
  Component,
  Directive,
  ComponentFactory,
  ComponentMetadata,
  ComponentResolver,
  Input,
  ReflectiveInjector,
  ViewContainerRef
} from '@angular/core';
import { Http } from '@angular/http';

export function createComponentFactory(resolver: ComponentResolver, metadata: ComponentMetadata): Promise<ComponentFactory<any>> {
    const cmpClass = class DynamicComponent {};
    const decoratedCmp = Component(metadata)(cmpClass);
    return resolver.resolveComponent(decoratedCmp);
}

@Directive({
    selector: 'my-ng-include'
})
export class MyNgInclude {

    @Input() src: string;

    constructor(private vcRef: ViewContainerRef, private resolver: ComponentResolver, private http: Http) {
    }

    ngOnChanges() {
      if (!this.src) return;

      this.http.get(this.src).toPromise().then((res) => {
        const metadata = new ComponentMetadata({
            selector: 'dynamic-html',
            template: res.text(),
        });
        createComponentFactory(this.resolver, metadata)
          .then(factory => {
            const injector = ReflectiveInjector.fromResolvedProviders([], this.vcRef.parentInjector);
            this.vcRef.createComponent(factory, 0, injector, []);
          });
      });
    }
}

只需按以下方式使用它:

<my-ng-include [src]="someChangingProperty"></my-ng-include>