如何使用 Aurelia 添加选项卡(或其他)UI 组件
How to add a tab (or other) UI component with Aurelia
我正在尝试将一些基于 jQuery 的 UI 组件集成到 Aurelia 应用程序中(特别是选项卡组件)。我试过 jQWidgets and EasyUI 并且每个都遇到了同样的问题。它们的工作方式基本相同:创建一些代表选项卡的 div,然后调用 $('#divTabs').tabs()
.
之类的方法
我创建了一个这样的自定义元素:
@customElement('tabs-element')
@inject(Element)
export class Tabs{
@bindable items;
@bindable areaId;
constructor(element) {
this.element = element;
}
attached(){
$(this.element).tabs();
}
}
这样的观点:
<template>
<div id.bind="areaId">
<div repeat.for="item of items" title.bind="item.id">
${item.username}
<!-- Eventually I want to use "compose" here ->
<!--<compose view-model="component/${item.name}"></compose>-->
</div>
</div>
</template>
然后我在主视图中像这样使用这个元素(其中 users
是从服务器获取的对象数组):
<tabs-element area-id="TopArea" items.bind="users"></tabs-element>
这在页面首次加载时工作正常,但是当随后获取新数据时,我似乎无法重新创建选项卡。 Aurelia 的 repeat.for
用新项目更新 DOM,但我不能再次调用 $('#divTabs').tabs()
,因为插件已经与 div 混为一谈(将它们包裹在其他 div 中,添加 类, 等等...) 第一次.
Here's a plunker 说明了问题。
我是不是走错了路?有没有办法在绑定数组更改时强制重新加载我的元素?
在我发布问题后,我开始阅读有关 Aurelia 的增强功能的信息,我认为这就是我的问题的答案。这让我可以在代码而不是标记中管理选项卡创建(我实际上认为无论如何更可取)。
我的自定义元素视图现在基本上是空的(div 插件需要的空 div 除外)。我连接到 itemsChanged 事件并在那里创建选项卡:
itemsChanged(newValue, oldValue){
//semi-pseudo code here
//clear out existing tabs
$('#divTabs').tabs('clear');
//loop through item array and create a tab for each item
newValue.forEach(item => {
$('#divTabs').tabs('addLast', item.ComponentTitle, '<div id="' + item.ComponentTitle + '"><compose view-model="component/' + item.ComponentName + '"></compose></div>');
let el = document.querySelector('#' + item.ComponentTitle);
this.templatingEngine.enhance({element: el});
});
}
经过进一步审查,这似乎与 Kendo UI Bridge works, which makes me think that this is the right track. Many thanks to this post 阐明此功能的方式相似。
我正在尝试将一些基于 jQuery 的 UI 组件集成到 Aurelia 应用程序中(特别是选项卡组件)。我试过 jQWidgets and EasyUI 并且每个都遇到了同样的问题。它们的工作方式基本相同:创建一些代表选项卡的 div,然后调用 $('#divTabs').tabs()
.
我创建了一个这样的自定义元素:
@customElement('tabs-element')
@inject(Element)
export class Tabs{
@bindable items;
@bindable areaId;
constructor(element) {
this.element = element;
}
attached(){
$(this.element).tabs();
}
}
这样的观点:
<template>
<div id.bind="areaId">
<div repeat.for="item of items" title.bind="item.id">
${item.username}
<!-- Eventually I want to use "compose" here ->
<!--<compose view-model="component/${item.name}"></compose>-->
</div>
</div>
</template>
然后我在主视图中像这样使用这个元素(其中 users
是从服务器获取的对象数组):
<tabs-element area-id="TopArea" items.bind="users"></tabs-element>
这在页面首次加载时工作正常,但是当随后获取新数据时,我似乎无法重新创建选项卡。 Aurelia 的 repeat.for
用新项目更新 DOM,但我不能再次调用 $('#divTabs').tabs()
,因为插件已经与 div 混为一谈(将它们包裹在其他 div 中,添加 类, 等等...) 第一次.
Here's a plunker 说明了问题。
我是不是走错了路?有没有办法在绑定数组更改时强制重新加载我的元素?
在我发布问题后,我开始阅读有关 Aurelia 的增强功能的信息,我认为这就是我的问题的答案。这让我可以在代码而不是标记中管理选项卡创建(我实际上认为无论如何更可取)。
我的自定义元素视图现在基本上是空的(div 插件需要的空 div 除外)。我连接到 itemsChanged 事件并在那里创建选项卡:
itemsChanged(newValue, oldValue){
//semi-pseudo code here
//clear out existing tabs
$('#divTabs').tabs('clear');
//loop through item array and create a tab for each item
newValue.forEach(item => {
$('#divTabs').tabs('addLast', item.ComponentTitle, '<div id="' + item.ComponentTitle + '"><compose view-model="component/' + item.ComponentName + '"></compose></div>');
let el = document.querySelector('#' + item.ComponentTitle);
this.templatingEngine.enhance({element: el});
});
}
经过进一步审查,这似乎与 Kendo UI Bridge works, which makes me think that this is the right track. Many thanks to this post 阐明此功能的方式相似。