如何将数据数组渲染为多个胡子部分?

时间:2016-11-07 17:12:49

标签: python arrays mustache pystache

我正在使用Python的pystache(这是标准的Mustache api)。

以下是我数据结构的示例:

{
  "results": [
    {
      "user": "foo",
      "flags": [
        "a",
        "b",
        "c"
      ]
    },
    { ... }
  ]
}

现在在我的模板中我尝试这样做:

{{#results}}
    {{> stuff}}
{{/results}}

stuff是部分的,部分看起来像这样:

user: {{ user }}
isX: {{ flags.x }}

现在为模板提供数据的是一个充当“视图模型”的类,因此我可以规范化一些数据并使模板与规范化数据交互,而不是上面显示的原始json数据。

问题是我不知道如何实现我的视图模型来处理我们循环遍历嵌套数据的事实。

使用上面的示例,我的原始数据使用一个字符串数组来表示flags值,我希望模板显示为true或false,具体取决于值x是否出现在标志数组。

在代码中,我可能会尝试这样实现:

class Feed(Presenter):
    def prepare_view(self, **params):
        self.view = View()
        self.view.template_path = '/app/static/views/feed.mustache'
        self.view.results = self.post.results
        self.view.flags = namedtuple('_', ['x'])('true')
        return self
  

想象一下namedtuple是我在数组上循环寻找x字符串的地方,我会根据它返回true或false

现在问题是,对于我来说,编写namedtuple代码,我需要知道要循环的结果的哪个索引。

我只是遗漏了一些非常明显的东西吗?

2 个答案:

答案 0 :(得分:2)

所以我设法通过改变代码设计和嵌套'Presenter'类来解决这个问题(但我很想知道其他人是如何做到这一点的;因为我尝试了多种其他方式尝试pystache语言功能没有工作的解决方案)...

class Feed(Presenter):
    def prepare_view(self, **params):
        self.view = View()
        self.view.template_path = '/app/static/views/feed.mustache'
        self.view.teasers = self.prepare_teasers()
        return self

    def prepare_teasers(self):
        return [Teaser(Context(result)) for result in self.post.results]
  

self.post上设置Presenter并提供我们希望使用的原始数据

然后Teaser与此顶级Feed演示者的效果相同,不同之处在于它使用了不同的“上下文”对象(即self.post值)作为其数据源:

class Teaser(Presenter):
    def prepare_view(self, **params):
        self.view = View()
        self.view.template_path = '/app/static/components/teaser/teaser.mustache'
        self.view.username = self.post.author
        self.view.uri = self.post.uri
        self.view.title = self.post.name
        return self
  

self.post现在是来自顶级self.post.results演示者Feed内部的元素之一

我们的代码从顶级演示者(Feed)开始,并开始递归呈现它找到的每个嵌套的Presenter

答案 1 :(得分:0)

在纯Javascript的Mustache模板中,我会这样做:

var results = fetchFromApi();
results['flags_icon'] = function(){
    if ( this == 'x') { return "fa fa-times";/*font awesome icon*/}  
}
var html = Mustache.to_html($("#mytemplate").html(), results);