如何使用Google Blogger Lambda操作员

时间:2016-05-25 12:04:01

标签: lambda blogger

Google Blogger为其模板语言实现了一组新的Lambda表达式运算符。请参阅:https://blogger.googleblog.com/2016/05/more-custom-template-flexibility.htmlhttps://productforums.google.com/forum/#!topic/blogger/l3phi8bscGY

给出的示例代码(b:if / revised)是:

<!-- Show a Flower image if the post has the label flower -->
<b:if cond='data:post.labels any (l => l.name == "Flower")'>
  <img src=’/img/flower.jpg’ />
</b:if>

我无法弄清楚如何在模板中使用它。有人请提供一些我可以插入模板的工作代码,看看它是否正常工作。

更新: 这似乎有效。但是,如何或者我可以删除循环?

<b:section class='Test1' id='Test1' maxwidgets='' showaddelement='no'>
    <b:widget id='Blog2' locked='true' title='Blog Posts' type='Blog' version='1' visible='true'>
        <b:includable id='main'>

            <b:loop values='data:posts' var='post'>
                <h1>Post found</h1>

                <b:if cond='data:post.labels any (label  => label.name == "flower")'>
                    <h1>Flower!</h1>
                </b:if>

            </b:loop>
        </b:includable>
    </b:widget>
</b:section>

例如,如果我删除循环,并将其替换为:

<b:if cond='data:posts any (p  => p.title  != "bob")'>                  
    <h1>Post found</h1>           
</b:if>>

我发现只有一个帖子,当我有几个帖子时,其中没有一个帖子名为bob!我已经尝试将lambda操作符从any切换到filter而不做任何更改。

1 个答案:

答案 0 :(得分:4)

我的问题的解决方案

愚蠢的我,如果我希望能够使用循环,我需要指定一个循环:

<b:loop values='data:posts filter (p  => p.id  != 0)'  var='post'>                    
  <h1>Post found: <data:post.title/></h1>           
</b:loop>

如何使用Blogger Lambda操作员

对于那些试图寻求帮助的人,我推荐以下文章,该文章解释了如何全面地使用Lambda表达式:http://www.bloggerever.com/2016/05/what-are-exactly-bloggers-lambda.html并基于https://productforums.google.com/forum/#!topic/blogger/l3phi8bscGY

本质上有7个Lambda运算符

  • 任何
  • 全部
  • count
  • 过滤器
  • 地图
  • 第一

每个都可以在if或loop条件语句中使用。一些未经测试的示例代码可帮助您入门。

如果Lambda中的任何项返回true,则任何运算符返回true,因此,例如,如果帖子具有与之关联的标签labela或labelb,则以下代码将返回true:

  <b:if cond='data:post.labels any
               (l  => l.name in {"labela","labelb"})'>
      ...Code here...
</b:if>

所有如果同时包含labela和labelb,则返回true:

  <b:if cond='data:post.labels all  
               (l  => l.name not in {"labela","labelb"})'>
      ...Code here...
</b:if>

none 如果既没有labela和labelb也会返回true:

  <b:if cond='data:post.labels all  
               (l  => l.name not in {"labela","labelb"})'>
      ...Code here...
</b:if>

count 将返回0,1或2,具体取决于帖子是否既没有labela或labelb,也不仅仅是labela或labela和labelb

  <b:if cond='data:post.labels count
               (l  => l.name not in {"labela","labelb"})'>
      ...Code here...
</b:if>

过滤器将返回一个数组并需要一个循环。以下示例将打印出每个帖子的标题,除非它的id为0(我不可能!)

<b:loop values='data:posts filter (p  => p.id  != 0)'  var='post'>                    
    <h1>Post found: <data:post.title/></h1>           
</b:loop>

首先喜欢过滤,但只会返回第一个匹配。

<b:loop values='data:posts first(p  => p.timestamp  == "4.2.09")'  var='post'>                    
    <h1>Post found: <data:post.title/></h1>           
</b:loop>

map 返回一个包含Lambda每个结果的数组。下面的代码会在h1标签中显示标签,其中&gt;&gt;前缀。

<b:loop values='data:post.labels map (l=> ">>" + l.name)' var='label'>
     <h1><data:label/></h1>
</b:loop>

最后一点:链接的文章表明Lambda可能只适用于帖子,标签和评论元素。它肯定适用于前两个,但我没有尝试过评论。