【问题标题】:Dynamic component does not bind properly动态组件未正确绑定
【发布时间】:2017-06-19 13:35:05
【问题描述】:

在我们的 Angular 2 应用程序中,我们使用来自 Kendo 的 Combobox 组件。该组件被包装到在运行时动态创建的组件中。创建的代码很简单:

let factory = this.resolver
        .resolveComponentFactory(ComboboxComponent);

nextTo.createComponent(factory);

nextTo 变量表示 Angular 必须在哪里创建组件。

@ViewChild('container', { read: ViewContainerRef })
container: ViewContainerRef;

container 变量代表 HTML 模板中的 div

NB :组件是在ngAfterViewInit 事件期间创建的。创建过程中不会抛出任何错误。

Kendo 组件已正确实例化和初始化,但是当我们在创建后影响数据时,该组件似乎无法识别绑定,并且什么也不做。有什么想法吗?

组件的HTML:

<kendo-combobox [data]="listItems"></kendo-combobox>

打字稿:

@Component({
    templateUrl: `combobox.component.html`,
    selector: 'combobox',
    styleUrls: [
        'combobox.component.css'
    ]
})
export class ComboboxComponent extends FieldComponent {
    public listItems: Array<string> = ["X-Small", "Small", "Medium", "Large", "X-Large", "2X-Large"];
}

NB2:FieldComponent 是一个抽象类,我们用于所有组件的全局操作。

EDIT1 :我终于找到了问题所在,但我不能说是哪里出了问题。当我检查 DOM 时,我可以看到 &lt;div role='combobox'&gt; 被隐藏,这是包含所有数据的组合框。那么为什么我的第二个组合框显示没有数据呢?

【问题讨论】:

    标签: javascript angular kendo-ui-angular2


    【解决方案1】:

    我怀疑在这种情况下不会触发组件的更改检测。 createComponent 返回一个 ComponentRef,它具有与该组件关联的更改检测器。创建动态组件后,您可以尝试调用该 ChangeDetectorRefdetectChanges()

    【讨论】:

    • 感谢您的回复!我已经尝试过了,但没有成功。我想知道为什么我必须这样做! Angular 会自动执行此操作...
    • 你能演示一下这个场景吗?我试图复制this example 中的行为,但似乎一切正常。也许我错过了什么。
    • 嘿,经过一番调查,我有了线索。在我的帖子中查看我的编辑,谢谢!
    • @ChristopheGigax 我想不出这可能是什么原因。您能否修改 plunkr 以使其复制行为?这将帮助我找出原因。谢谢!
    • 我找到了副作用的原因,我会发布回复。
    【解决方案2】:

    我找到了导致这种奇怪行为的原因。由于项目一开始,我们使用 Kendo JQuery 作为我们的组件,我们使用kendo.all.js。我真的不知道为什么,但似乎 kendo.all.js 干扰了新 Angular 组件的 kendo-combobox HTML 模板,并且它注入了一些导致奇怪行为的暴躁 HTML。

    【讨论】:

    • 这是由于我们的Web Components 集成。 Web 组件和 Angular 都为自定义标签/组件选择器使用相同的名称。
    • 是的,我明白了 ;-) 也许您应该在文档或其他地方通知这个丑陋的问题?我认为像我们这样想要迁移组件的类似项目将面临同样的问题......
    • 实际上 Web Components 支持已经从 *.all 包中移除了。升级到较新版本的脚本应该会删除此行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2019-02-08
    • 2013-12-05
    • 2016-12-28
    相关资源
    最近更新 更多