Как использовать коллекцию партиалов для вставки партиалов на основе URL-адреса?

Я использую docpad с механизмом эко-шаблонов и плагином partials. Смысл этого в том, чтобы вставить список фрагментов на целевую страницу.

Логичный подход (для меня) состоит в том, чтобы перебрать коллекцию фрагментов и вставить каждый фрагмент.

У меня есть следующая структура (в соответствии с руководством для начинающих по добавлению сообщений в блог и документ partials):

src
├── documents
│   ├── index.html.eco
│   ├── scripts ...
│   └── styles ...
├── files...
├── layouts
│   └── default.html.eco
└── partials
    ├── hello.html.eco
    └── world.html.eco

Содержимое hello.html.eco:

---
title: "Hello"
isArticle: true
---
Hello

Содержимое файла world.html.eco:

---
title: "World"
isArticle: true
---
World

Содержимое default.html.eco (макет)

<html>
<head>
    <title>Test Partials</title>
    <%- @getBlock("styles").add(["/styles/style.css"]).toHTML() %>
</head>
<body>
    <h1><%= @document.title %></h1>
    <%- @content %>
    <%- @getBlock("scripts").add(["/vendor/jquery.js","/scripts/script.js"]).toHTML() %>
</body>
</html>

И содержимое index.html.eco:

---
title: "Welcome"
layout: "default"
isPage: true
---
<p>Welcome to my website</p>

<% for page in @getCollection("partials").findAllLive({isArticle:true}).toJSON(): %>
<article>
    <%- @partial("<%= page.url %>") %>
</article>
<% end %>

Как и выше, docpad вылетит с ошибкой Cannot read property '0' of null. Однако, если я удалю строку <%- @partial("<%= page.url %>") %>, тогда это сработает.

Следующая строка извлекает все файлы в каталоге partials, где для параметра isArticle установлено значение true.

<% for page in @getCollection("partials").findAllLive({isArticle:true}).toJSON(): %>

Если я изменю <%- @partial("<%= page.url %>") %> на <p>page.url</p>, то в выходных списках будут /hello.html и /world.html, чего я и ожидаю.

Похоже, что использование <%- дважды в одной строке, фактически пытающееся внедрить эко, вызывает проблему.

Кто-нибудь знает, как я могу обойти это? Я пытаюсь избежать ручного кодирования @partial("<filename>") для каждого файла, который я хочу вставить. Есть ли способ как-то передать @partial значение page.url?


person Metalskin    schedule 12.03.2014    source источник


Ответы (1)


Проблема не в частичном плагине, а во втором операторе <%=. Поскольку мы уже находимся в эко, нам не нужно снова возвращаться в эко. Таким образом, второй <%= является избыточным, поскольку на переменные можно ссылаться напрямую.

Первоначально я должен был назвать этот вопрос «Как вы ссылаетесь на переменные в эко, которые были ранее установлены».

Решение состоит в том, чтобы использовать для index.html.eco следующее:

---
title: "Welcome"
layout: "default"
isPage: true
---
<p>Welcome to my website</p>

<% for page in @getCollection("partials").findAllLive({isArticle:true}).toJSON(): %>
<article>
    <%- @partial(page.url) %>
</article>
<% end %>

Как видно выше, на page.url теперь ссылаются напрямую.

person Metalskin    schedule 12.03.2014