【问题标题】:Optimize Jade Wrapper优化玉器包装
【发布时间】:2015-09-11 02:27:38
【问题描述】:

我正在寻找打印从一系列对象中提取的 div。我可以通过使用下面的管道语法来实现这一点。

each i, key in faq
    if (key == 0)
        | <div class="list-group dropdown">
        |   <h6 class="list-title" data-toggle="dropdown">
        |       <strong>#{faq[key].section}</strong>
        |   </h6>
        |   <a class="list-group-item">#{faq[key].question}</a>

    else if (faq[key].section != faq[key-1].section)
        | </div>
        | <div class="list-group dropdown">
        |   <h6 class="list-title" data-toggle="dropdown">
        |       <strong>#{faq[key].section}</strong>
        |   </h6>
        |   <a class="list-group-item">#{faq[key].question}</a>

    else
        |   <a class="list-group-item">#{faq[key].question}</a>

    if (key == faq.length)
        | </div>

但是我想在没有管道语法的情况下实现这一点。我想知道这是否可能?

我基本上是在寻找这样的东西

each i, key in faq
    if (key == 0 || faq[key].section != faq[key-1].section)
        h6.list-title(data-toggle="dropdown")
            strong #{faq[key].section}
    else
            strong #{faq[key].section}

但打印出来的东西与

<div class="list-group ">
    <h6 class="list-title" data-toggle="dropdown">
        <strong>#{faq[key].section}</strong>
    </h6>
    <a class="list-group-item">#{faq[key].question}</a>
</div>
<a class="list-group-item">#{faq[key].question}</a>

当我想要它时

<div class="list-group ">
    <h6 class="list-title" data-toggle="dropdown">
        <strong>#{faq[key].section}</strong>
    </h6>
    <a class="list-group-item">#{faq[key].question}</a>
    <a class="list-group-item">#{faq[key].question}</a>
</div>

扩展...

<div class="list-group ">
    <h6 class="list-title" data-toggle="dropdown">
        <strong>Desktop FAQ</strong>
    </h6>
    <a class="list-group-item">Who licenses the fonts? The designer or the company?</a>
</div>
<div class="list-group ">
    <h6 class="list-title" data-toggle="dropdown">
        <strong>Licensing</strong>
    </h6>
    <a class="list-group-item">Who licenses the fonts?</a>
    <a class="list-group-item">Who wants to licenses the fonts?</a>
</div>
<div class="list-group ">
    <h6 class="list-title" data-toggle="dropdown">
        <strong>Installation</strong>
    </h6>
    <a class="list-group-item">Installation question 1</a>  
    <a class="list-group-item">Inst. Q 2</a>
</div>

【问题讨论】:

    标签: javascript node.js optimization pug templating


    【解决方案1】:

    首先,if-else 逻辑过于复杂且不遵循 DRY 原则。你的 if-else 只需要决定三件事:

    1. 在开头包含&lt;/div&gt;
    2. 包括中间部分? (if (key == 0)的内容)
    3. 在末尾包含&lt;/div&gt;? (这里的逻辑很好)

    按照现在的代码,您无法完全移除管道。原因是 Jade 会自动为您处理开始和结束标签。但是,您正在尝试自己处理它,因此您需要在此处覆盖 Jade。但是,除非您有充分的理由相信标签可能不匹配,否则您不应该为此烦恼。我假设你会这样做,因为你在打扰。

    好处是你只需要它们来处理你可能会遇到开始和结束标签不匹配问题的行。因此,您只需要 &lt;/div&gt; 的行以及 &lt;div&gt; 的行。


    代码应如下所示(建议为condAcondB 使用更好的变量名称)

    each i, key in faq
        - condA = (key == 0)
        - condB = (faq[key].section != faq[key-1].section)
    
        if (not condA and condB)
            | </div>
        if (condA or condB)
            | <div class="list-group dropdown">
            h6.list-title(data-toggle='dropdown')
                strong #{faq[key].section}
        a.list-group-item #{faq[key].question}
    
        if (key == faq.length)
            | </div>
    

    您可能完全可以在没有管道的情况下完成此操作,但我不确定您到底要做什么。


    话虽如此,听起来您当前使用的数据结构不足以完成任务。似乎您应该使用以下格式的 2D 结构:faq[topic][question#] = question。您示例中的数据结构如下所示:

    faq = {
        "Desktop FAQ": {
            "1": "Who licenses the fonts? The designer or the company?"
        },
        "Licensing": {
            "1": "Who licenses the fonts?",
            "2": "Who wants to licenses the fonts?"
        },
        "Installation": {
            "1": "Installation question 1",
            "2": "Inst. Q 2"
        }
    }
    

    这里的代码带有示例faq 数据,它在online demo for Jade 中工作,faq 被压缩为一行,因为在多行上定义 JS 对象似乎在 Jade 中效果不佳(或者至少在线演示)。

    - faq={"Desktop FAQ":{1:"Who licenses the fonts? The designer or the company?"},"Licensing":{1:"Who licenses the fonts?",2:"Who wants to licenses the fonts?"},"Installation":{1:"Installation question 1",2:"Inst. Q 2"}}
    
    for questions, topic in faq
        .list-group.dropdown
            h6.list-title(data-toggle='dropdown')
                strong #{topic}
            for question in questions
                a.list-group-item #{question}
    

    【讨论】:

    • 我在关注时遇到了问题。您认为您可以使用示例解决方案代码修改您的答案吗?
    • @QuinnKeaveney 更新了我想到的一个版本,以及一个建议将数据结构更改为简单代码的版本。尽管您可能希望在没有问题的情况下添加主题检查,并在那里显示除空白以外的其他内容。另外HTML2Jade 结合在线演示很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 2015-04-04
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多