我正在使用
Python的pystache(这是标准的Mustache api).
以下是我数据结构的示例:
{
"results": [
{
"user": "foo",
"flags": [
"a",
"b",
"c"
]
},
{ ... }
]
}
现在在我的模板中我尝试这样做:
{{#results}}
{{> stuff}}
{{/results}}
哪里的东西是偏的,那部分看起来像这样:
user: {{ user }}
isX: {{ flags.x }}
现在为模板提供数据的是一个充当“视图模型”的类,因此我可以规范化一些数据并让模板与规范化数据交互,而不是上面显示的原始json数据.
问题是我不知道如何实现我的视图模型来处理我们循环遍历嵌套数据的事实.
使用上面的例子,我的原始数据使用一个字符串数组来表示flags值,其中我希望模板显示true或false,具体取决于值x是否出现在flag数组中.
在代码中我可能会尝试这样实现:
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
just imagine the
namedtuple
was where I loop over the array looking for thex
string and I return true or false based on that
现在问题是,对于我来说,编写了一个namedtuple代码,我需要知道要循环的结果的哪个索引.
我只是缺少一些非常明显的东西吗?
最佳答案 所以我设法通过改变代码设计和嵌套’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]
where
self.post
is set on thePresenter
and provides the raw data we’re looking to consume
Teaser的效果与此顶级Feed Presenter的效果相同,区别在于它给出了一个不同的“context”对象(即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
is now one of the elements from insideself.post.results
from the top levelFeed
presenter
我们的代码从顶级演示者(Feed)开始,并开始递归渲染它找到的每个嵌套的Presenter