angular2 学习笔记 ( Dynamic Component 动态组件)

一样这一篇最要讲概念而已.

refer :

http://blog.rangle.io/dynamically-creating-components-with-angular-2/ (例子)
https://www.ag-grid.com/ag-grid-angular-aot-dynamic-components/ (动态 entryComponents)

http://stackoverflow.com/questions/40106480/what-are-projectable-nodes-in-angular2 (Projectable nodes, something like transclude)

http://stackoverflow.com/questions/38888008/how-can-i-use-create-dynamic-template-to-compile-dynamic-component-with-angular ( dynamic Jit version )

https://medium.com/@isaacplmann/if-you-think-you-need-the-angular-2-runtime-jit-compiler-2ed4308f7515#.72ln3bcsy (many way Aot version)

http://stackoverflow.com/questions/39033835/angularjs2-preload-server-configuration-before-the-application-starts ( angular initialize )

动态组件分 2 种

1. Jit

2. Aot

Jit 的情况下你可以动态的写组件模板, 最后 append 出去, 类似 ng1 的 $compile

Aot 的话, 模板是固定的, 我们只是可以动态创建 component 然后 append 出去

这一篇只会谈及 Aot

要知道的事项 :

1. 所有要动态的组件都要另外声明到 entryComponents 里头, 原因是 ng 是通过扫描模板来 import component class 的, 动态组件不会出现在模板上所以我们要用另一个 way 告诉 ng。

2. 目前只有动态组件,没有动态指令

3. 例子

@Component({
    selector: ‘aaa‘,
    template: ``
})
export class AAAComponent implements OnInit, AfterContentInit {
    constructor(
        private vcr: ViewContainerRef,
        private cfr: ComponentFactoryResolver
    ) { }

    @ContentChildren("dynamic", { read: ElementRef }) elem: QueryList<ElementRef>  //read 的作用是强转类型

    ngOnInit() {

    }

    ngAfterContentInit() {
        let providers = ReflectiveInjector.resolve([AbcService]); //为组件添加 providers
        let injector = ReflectiveInjector.fromResolvedProviders(providers, this.vcr.parentInjector); //创建注入器给 component (记得要继承哦)
        let factory = this.cfr.resolveComponentFactory(AbcComponent); //创建 component 工厂
        let component = factory.create(injector,[[this.elem.first.nativeElement],[this.elem.last.nativeElement] ]); //创建 component, 这是就把注入器放进了, 后面的 array 是给 ng-content 用的
        component.instance.name = "keatkeat"; // 对 input, output 做点东西
        this.vcr.insert(component.hostView, 0); // 插入到模板中  0 是 position, 如果是 0 其实可以不用放. 

        // 如果不需要设定 providers 的话,可以省略一些 :
        // let factory = this.resolver.resolveComponentFactory(AbcComponent);
        // let component = this.vcr.createComponent(factory, 0);
        // component.instance.name = "keatkeat";
    }
}

里头说的 ng-content, 就是 Projectable nodes , 我个人认为这个做法还不太理想,因为 ng-content 应该是可以通过 select 找到对应的 tranclude 的,不过这里的参数 array 已经固定了 tranclude 的位置.

我的想法是, 如果你要做类似 tranclude 的事情, 改用 input 传递 templateRef.

类似这样

@Component({
    template : `
        <p>final</p>
        <template [ngTemplateOutlet]="template" [ngOutletContext]="{ innerValue : ‘huhu‘ }" ></template>
    `,
    selector : "final"
})
export class FinalComponent implements OnInit {
    constructor(
    ) { }

    @Input()
    template : TemplateRef<any> //传进来

    ngOnInit() {
        console.log(this.template);
    }
}

4. 个人的想法

一个动态组件应该和平时的组件是一样的,意思是我们可以随时把任何一个组件改成动态调用的方式.

不过目前 ng 支持的不是很好

-input, output (这个可以)

-tranclude (Projectable nodes 显然和 ng-content配合不上)

-在 component 上方指令 (动态创建的 component, 没办法加上指令, 这导致了 dynamic accessor 很难写)

时间: 2024-10-23 00:40:03

angular2 学习笔记 ( Dynamic Component 动态组件)的相关文章

《Hibernate学习笔记八》:组件映射

<Hibernate学习笔记八>:组件映射 前面介绍了一对一的单向.双向外键关联,例如,学生证和学生是一个一对一的关系.这篇博文主要是介绍下组件映射,即一个是另一个的一部分,例如,学生证的信息也可以作为学生信息的一部分,即在数据库中只存在学生一个表,而不是有学生和学生证两个表,并且这两个表中有一个一对一的关联关系. 如下: 有人或许会说,那我们就将学生和学生证的信息写在一个类中,则就不需要组件映射了,确实可以这样,但是,根据类的设计原则,我们一般都会将其设计为两个类,然后将学生证的信息作为一个

Vue.js学习笔记(7)组件详解

在这篇文章之前小颖分享过小颖自己写的组件:Vue.js学习笔记(5)tabs组件和Tree升级版(实现省市多级联动) 先给大家看下小颖写了一个简单的组件示例: 组件: <template> <div class='content' v-if='showFlag'> <input type="text" v-bind:style='{ width:compwidth+"px"}' v-model='compvalue' @keyup='m

angular2 学习笔记 ( DI 依赖注入 )

refer : http://blog.thoughtram.io/angular/2016/09/15/angular-2-final-is-out.html ( search Dependency Injection ) 小说明 : 大致流程 : 把 providers 写入 injector, 然后通过 injector 来注入 service. 单列 : 一个 service 在一个 injector 里是单列. 查找逻辑 : injector 有父子关联, 如果子 injector 没

angular2 学习笔记 ( Component 组件)

ng2 的组件和游览器原生的组件是同一个概念,在方方面面都很相似. 和 ng1 一样,组件少不了数据绑定 1. model to view 绑定 (单向绑定, 意思是这个值应该是只读的, 组件内部不一样修改这个值) template: ` <my-product [model-to-view-value]="'Derrick' + 'Yam'" ></my-product> ` @Input("model-to-view-value") //

Angular2学习笔记——在子组件中拿到路由参数

工作中碰到的问题,特此记录一下. Angular2中允许我们以`path\:id\childPath`的形式来定义路由,比如: export const appRoutes: RouterConfig = [{ path: 'app/:id', component: AppComponent, children: [ { path: 'share', component: AppShareComponent }, { path: 'issue', component: AppIssueCompo

Angular2学习笔记——NgModule

在Angular2中一个Module指的是使用@NgModule修饰的class.@NgModule利用一个元数据对象来告诉Angular如何去编译和运行代码.一个模块内部可以包含组件.指令.管道,并且可以将它们的访问权限声明为公有,以使外部模块的组件可以访问和使用到它们. 模块是用来组织应用的,通过模块机制外部类库可以很方便的扩展应用,Rc5之后,Angular2将许多常用功能都分配到一个个的模块中,如:FormModule.HttpModule.RouterModule. NgModule的

【学习笔记】Vue.js组件

一.组件的注册 组件的注册分为全局注册和局部注册 全局注册 1 Vue.component('my-component', { 2 // 选项 3 }) 局部注册 1 var Child = { 2 template: '<div>A custom component!</div>' 3 } 4 new Vue({ 5 // ... 6 components: { 7 // <my-component> 将只在父模板可用 8 'my-component': Child

angularjs2 学习笔记(二) 组件

angular2 组件 首先了解angular2 组件的含义 angular2的应用就是一系列组件的集合 我们需要创建可复用的组件供多个组件重复使用 组件是嵌套的,实际应用中组件是相互嵌套使用的 组件中的数据调用可以使用inputs和outputs 一个组件可以是一种指令 一个组件可以包含前端表现及后端逻辑 一个组件可以是一个代码片段,能够独立运行 进一步理解指令 一个指令就是一个组件 一个指令可以装饰指令,用于改变DOM 一个指令可以是模板指令,可以改变element 一个实际例子 一辆车有门

Angular2学习笔记——路由器模型(Router)

Angular2以组件化的视角来看待web应用,使用Angular2开发的web应用,就是一棵组件树.组件大致分为两类:一类是如list.table这种通放之四海而皆准的通用组件,一类是专为业务开发的业务组件.实际开发中大部分时间我们都需要处理业务组件.对于SPA应用来说,一个通用的问题就是如何控制页面的切换,解决这个问题的通用方法就是利用路由器来实现. 路由配置 现在我们先撇开Angular2来看看通用的路由器模型.通常来讲SPA应用需要路由配置信息: [ { path: '', pathMa