背景
我正在尝试在AEM中制作动态导航组件。目前我一直试图在文档和网上找到信息来帮助我但却找不到多少。
我的应用程序将vue组件加载到AEM中,因此前端由VUE控制,数据通过props传入。
我想将这些页面的页面和子页面传递到vue组件中,因此我可以使用下拉导航为任何链接创建动态导航。
示例
目前我找到了一种使用java类加载根页面链接的方法。我是这样做的,
package services.agro.something.core.models;
import java.util.*;
import java.util.Iterator;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageFilter;
import com.adobe.cq.sightly.WCMUsePojo;
public class SidebarNavigationModel extends WCMUsePojo{
private List<Page> items = new ArrayList<Page>();
private Page rootPage;
// Initializes the navigation
@Override
public void activate() throws Exception {
rootPage = getCurrentPage().getAbsoluteParent(2);
if (rootPage == null) {
rootPage = getCurrentPage();
}
Iterator<Page> childPages = rootPage.listChildren(new PageFilter(getRequest()));
while (childPages.hasNext()) {
items.add(childPages.next());
}
}
// Returns the navigation items
public List<Page> getItems() {
return items;
}
// Returns the navigation root
public Page getRoot() {
return rootPage;
}
}
然后我就可以使用这样的数据,
<div data-sly-use.sidebarNavigationModel="services.agro.gde.core.models.SidebarNavigationModel" class="sidebar-navigation ae-spacing-indent">
<div class="sidebar-nav-container">
// This is a vue component that I am trying to pass data to. The data comes through as commas and when I expect an array an error throws in console stating it expects array but receives a string.
<sidebar-navigation title="${properties.title}" items="${sidebarNavigationModel.items}"></sidebar-navigation>
</div>
// This outputs 16 commas to the screen ${sidebarNavigationModel.items}
<ul class="nav navbar-nav navbar-center">
// This outputs a link to home
<li><a href="${sidebarNavigationModel.root.path}.html">HOME</a></li>
// This outputs 19 links like I expect
<li class="nav navbar-nav navbar-left" data-sly-repeat="${sidebarNavigationModel.items}">
<a href="${item.path}.html">${item.title}</a>
</li>
</ul>
</div>
问题
如果我能更好地理解循环中返回的数据集,我相信我可以将其传递给vue组件,就像我尝试过的那样。
为什么在循环之外输出逗号以及为什么在将它传递给vue时它看起来像是一个字符串?
如果网站加载到数据集中,我如何获取网站的子页面?我可以从模板传递给我的vue组件?
答案 0 :(得分:1)
HTL / Sightly正在尝试渲染数组但是对于每个项目它都不会呈现任何内容(因为它无法评估和呈现Page
对象)。您可以做的是按下Use-Object中的数据以准确返回所需的字符串或在脚本中处理它,如:
[<sly data-sly-repeat="${logic.items}">{title="${item.title}",path="${sidebarNavigationModel.path}"}${itemList.last?'':','}</sly>]
答案 1 :(得分:0)
vue组件正在打印逗号,因为java类返回的列表是com.day.cq.wcm.api.Page
个对象的列表,而不是String列表。很明白它是一个Page对象,因此能够在其上调用页面方法来检索路径和标题。
获取子页面列表 - 您可以通过不同的方式执行此操作。取决于您的内容结构和您的要求 - 您认为是儿童页面和父页面。
Page
API's,例如hasChild()
,listChildren()
等来推动构建父子导航结构的逻辑。所有这一切都可以从你的java类中实现。