在jQuery插件模板内绑定Angular2组件

埃里克

我正在研究在Angle 2项目中使用剑道。

正确设置窗口小部件是没有问题的:

ngOnInit() {
    let options = inputsToOptionObject(KendoUIScheduler, this);
    options.dataBound = this.bound;
    this.scheduler = $(this.element.nativeElement)
        .kendoScheduler(options)
        .data('kendoScheduler');

}

运行该插件时,该插件将修改DOM(据我所知,无需修改angular2维护的影子DOM)。我的问题是,如果我想在插件内部的任何地方使用组件(例如在模板中),Angular不会意识到它的存在并且不会绑定它。

例子:

public views:kendo.ui.SchedulerView[] = [{
    type: 'month',
    title: 'test',
    dayTemplate: (x:any) => {
        let date = x.date.getDate();
        let count = this.data[date];
        return `<monthly-scheduler-day [date]="test" [count]=${count}"></monthly-scheduler-day>`
    }
}];

每月排课日课程:

@Component({
    selector: 'monthly-scheduler-day',
    template: `
            <div>{{date}}</div>
            <div class="badge" (click)=dayClick($event)>Available</div>
    `
})
export class MonthlySchedulerDayComponent implements OnInit{
    @Input() date: number;
    @Input() count: number;
    constructor() {
        console.log('constructed');
    }
    ngOnInit(){            
        console.log('created');
    }

    dayClick(event){
        console.log('clicked a day');
    }

}

是否有“正确”的方式将这些组件绑定到小部件创建的标记内?我设法通过侦听来自小部件的bind事件,然后遍历它创建的元素并使用DynamicComponentLoader来做到这一点,但是感觉很不对。

埃里克

我在此线程中找到了一些所需的详细信息:https : //github.com/angular/angular/issues/6223

我鞭打了这项服务以处理绑定我的组件:

import { Injectable, ComponentMetadata, ViewContainerRef, ComponentResolver, ComponentRef, Injector } from '@angular/core';

declare var $:JQueryStatic;

@Injectable()
export class JQueryBinder {
    constructor(
        private resolver: ComponentResolver,
        private injector: Injector
    ){}

    public bindAll(
        componentType: any, 
        contextParser:(html:string)=>{}, 
        componentInitializer:(c: ComponentRef<any>, context: {})=>void): 
            void 
        {
        let selector = Reflect.getMetadata('annotations', componentType).find((a:any) => {
            return a instanceof ComponentMetadata
        }).selector;

        this.resolver.resolveComponent(componentType).then((factory)=> {
            $(selector).each((i,e) => {
                let context = contextParser($(e).html());
                let c = factory.create(this.injector, null, e);
                componentInitializer(c, context);
                c.changeDetectorRef.detectChanges();
                c.onDestroy(()=>{
                    c.changeDetectorRef.detach();
                })
            });
        });        
    }
}

参数:

  • componentType:要绑定的组件类。它使用反射来拉动所需的选择器
  • contextParser:使用现有子html并构造一个上下文对象的回调(您需要初始化组件状态的任何事情)
  • componentInitializer-使用您解析的上下文初始化创建的组件的回调

用法示例:

    let parser = (html: string) => {
        return {
            date: parseInt(html)
        };
    };

    let initer =  (c: ComponentRef<GridCellComponent>, context: { date: number })=>{
        let d = context.date;

        c.instance.count = this.data[d];
        c.instance.date = d;
    }

    this.binder.bindAll(GridCellComponent, parser, initer );

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Angular2组件模板与视图模板

来自分类常见问题

Angular2组件@Input双向绑定

来自分类Dev

Angular2组件是单向绑定还是输入?

来自分类Dev

将函数结果绑定到Angular2组件(TypeScript)

来自分类Dev

Angular2组件未将属性绑定到DOM

来自分类Dev

如何将JavaScript重新绑定到angular2组件中的元素?

来自分类Dev

具有双向绑定输入的Angular2组件不会触发更改事件

来自分类Dev

为什么我的模板在angular2组件中不起作用?

来自分类Dev

为什么不能将<template>用作angular2组件模板?

来自分类Dev

为什么不能将<template>用作angular2组件模板?

来自分类Dev

如何访问模板内的Angular 1.5组件属性

来自分类Dev

Angular2组件内的iframe,类型“ HTMLElement”上不存在属性“ contentWindow”

来自分类Dev

jQuery timpicker方法中Angular2组件的上下文

来自分类Dev

Angular 2组件* ngFor模板解析错误

来自分类Dev

删除Angular 2组件的重复模板标记

来自分类Dev

尝试在angular2组件中使用exportAs

来自分类Dev

CodeMirror作为Angular2组件

来自分类Dev

Angular2组件-动态内联样式

来自分类Dev

Angular2组件::按类的ViewChild / ContentChild

来自分类Dev

以编程方式插入不同的Angular2组件

来自分类Dev

使用javascript协调angular2组件

来自分类Dev

获取传递到Angular2组件的数据

来自分类Dev

HTML代码形式Angular2组件属性

来自分类Dev

如何使angular2组件ng无效

来自分类Dev

测试使用setInterval或setTimeout的Angular2组件

来自分类Dev

Angular2组件构造函数未调用

来自分类Dev

CodeMirror作为Angular2组件

来自分类Dev

尝试在angular2组件中使用exportAs

来自分类Dev

使用javascript协调angular2组件

Related 相关文章

热门标签

归档