【问题标题】:How to render array of data into multiple mustache partials?如何将数据数组呈现为多个小胡子部分?
【发布时间】:2016-11-07 17:12:49
【问题描述】:

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

这是我的数据结构的示例:

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

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

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

其中stuff 是一个部分,该部分看起来像这样:

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

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

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

以上面的例子为例,我的原始数据使用一个字符串数组来表示 flags 值,我希望模板显示真或假,具体取决于值 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 字符串的地方,然后我会根据它返回真或假

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

我只是错过了一些非常明显的东西吗?

【问题讨论】:

    标签: python arrays mustache pystache


    【解决方案1】:

    所以我自己通过更改代码设计和嵌套“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.postPresenter 上设置并提供我们希望使用的原始数据

    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 现在是来自顶级 Feed 演示者的 self.post.results 内部的元素之一

    我们的代码从顶级 Presenter (Feed) 开始,并开始递归渲染它找到的每个嵌套 Presenter

    【讨论】:

      【解决方案2】:

      在纯基于 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);
      

      【讨论】:

        猜你喜欢
        • 2014-03-28
        • 2015-05-21
        • 2020-05-10
        • 2018-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-22
        相关资源
        最近更新 更多