我正在使用 aurelia 和 ES6 创建一个级别菜单组件。我得到的json是:
data: [
levelId: 1,
label: 'Level1',
chlidItems: [
{
levelId: 2,
label: 'Level2',
childItems: [] // so on multiple levels
}
]
]
在 HTML 中,我在数据上直接使用 repeat.for 显示基本级别。
<div class="main-level" ref="pgElm">
<div class="main-label" repeat.for="dataObj of data" click.trigger="openChildItems($event, dataObj, $index)">${dataObj.label}</div>
</div>
我想在点击时添加子项目。我尝试了两种方法。
第一次我使用 aurelia 模板引擎添加子 div。
openChildItems(_event, _dataObj, _index) {
this.$pgElm = $(this.pgElm);
if (_dataObj && _dataObj.childItems && _dataObj.childItems.length) {
let parentDiv = null;
if (_dataObj.levelId === this.schema.data[0].levelId) {
parentDiv = this.$pgElm.find('.main-label')[_index];
} else {
parentDiv = this.$pgElm.find('.child-' + _dataObj.levelId + '-label')[_index];
}
let childDiv = document.createElement('div');
childDiv.className = 'child-' + _dataObj.childItems[0].levelId;
parentDiv.appendChild(childDiv);
this.className = 'child-' + _dataObj.childItems[0].levelId + '-label';
this.variableName = 'childItems' + _dataObj.childItems[0].levelId ;
this.viewData['childItems' + _dataObj.childItems[0].levelId] = _dataObj.childItems;
childDiv.innerHTML = "<div class='${className}' repeat.for='child of viewData[variableName]' click.trigger='openChildItems($event, child, $index)'>${child.label}</div>";
let view = this.templatingEngine.enhance({element: childDiv, bindingContext: this});
}
}
这种方法的问题是数据在各个层面都在变化。
然后我尝试使用另一种方法来附加 div。
openChildItems(_event, _dataObj, _index) {
this.$pgElm = $(this.pgElm);
if (_dataObj && _dataObj.childItems && _dataObj.childItems.length) {
let parentDiv = null;
if (_dataObj.levelId === this.schema.data[0].levelId) {
parentDiv = this.$pgElm.find('.main-label')[_index];
} else {
parentDiv = this.$pgElm.find('.child-' + _dataObj.levelId + '-label')[_index];
}
let childDiv = document.createElement('div');
childDiv.className = 'child-' + _dataObj.childItems[0].levelId;
$(parentDiv).append(childDiv);
let childItems = _dataObj.childItems;
let index = 0;
for (let child of childItems) {
let childLabelDiv = document.createElement('div');
childLabelDiv.className = 'child-' + child.levelId + '-label';
childLabelDiv.innerHTML = child.label;
childLabelDiv.addEventListener('click', (e)=>{
this.evtOpenChildItems(e, child, index);
e.stopPropagation();
});
$(childDiv).append(childLabelDiv);
index ++;
}
}
}
现在我遇到的问题是,当我单击 1 级子项时,我将 parentDiv 设置为未定义。
请帮助我解决我的方法出错的地方以及是否有其他方法可以实现它?