我是胡子的新手,这是我正在尝试的第一个项目。我将其与kohana 3.2和Kostache模块以及胡子的PHP实现一起使用。
我有一个体育锦标赛的集合,每个比赛都有很多事件,每个事件都有3个我称之为"结果"的实体。我的任务是在一个表格中显示所有这些。以下模板显示了我需要如何显示此表。
{{#tournaments}}
<h2>{{name}}</h2>
<table class="event_list">
{{#events.find_all}}
<tr>
<td>{{day}}</td>
{{#outcomes.find_all}}
<td class="outcome">{{name}}</td>
{{/outcomes.find_all}}
</tr>
{{/events.find_all}}
</table>
{{/tournaments}}
现在我的问题和问题。在显示"结果"时,我需要为每个.所以我的意思是我为每个事件有 3 个"结果",因此我为每个事件有 3 个不同的 CSS 类。但是在 {{#outcomes.find_all}} 循环中,我不知道它是第一个实体还是第二个或第三个实体。我能做些什么呢?
为了解决这个问题,我正在考虑使用函数。我想到向此视图的类添加函数,该函数将呈现所有事件"结果",这可能如下所示:
{{#tournaments}}
<h2>{{name}}</h2>
<table class="event_list">
{{#events.find_all}}
<tr>
<td>{{day}}</td>
{{print_outcomes}}
</tr>
{{/events.find_all}}
</table>
{{/tournaments}}
但显然我需要在该函数中传递"结果"的集合,然后我意识到我无法在该函数中传递任何东西。那么这些问题是如何用小胡子解决的呢?
另外,如果我有这样非常简单的功能:
public function print_outcomes(){
return "<td>aa</td>";
}
它会在输出之前传递它 trougth url_encode,这样我就会得到
<td>aa</td>
这是可以解决的吗?
您可以在视图模型中尝试使用函数,如下所示:
public function outcomes()
{
$outcomes = ORM::factory('outcome')->find_all();
$result = array();
foreach ($outcomes as $outcome)
{
$push = $outcome->object();
$push['name'] = $outcome->name;
$push['class'] = 'class_'.$outcome->name;
$result[] = $push;
}
return $result;
}
然后在你的小胡子中,你会有这样的东西:
{{#outcomes}}
<td class="{{class}}">{{name}}</td>
{{/outcomes}}
Mustache 是无逻辑的,这意味着你想要的所有逻辑(简单的存在检查和循环除外)都应该通过在你用作输入的 JSON 中包含逻辑来完成。
基本上,您需要将所有变量(例如 css 类)编码到 json 中。
按照您的示例,请参阅下面的 JSON 和模板(未经测试,但这应该可以让您继续)
杰伦
{
tournaments:[
{
name: "tournamentA",
events: [
{
day: "day1",
outcomes:[
{
name: "outcomeTypeA",
cssClass: "classA"
},
{
name: "outcomeTypeB",
cssClass: "classB"
},
{
name: "outcomeTypeC",
cssClass: "classC"
}
]
},
{
//another event of tourA
}
]
},
{
//tournamentB, etc .
}
]
}
模板
{{#tournaments}}
<h2>{{name}}</h2>
<table class="event_list">
{{#events}}
<tr>
<td>{{day}}</td>
{{#outcomes}}
<td class="outcome {{cssClass}}">{{name}}</td>
{{/outcomes}}
</tr>
{{/events}}
</table>
{{/tournaments}}
事实上,你也可以以类似的方式使用函数:即:将函数嵌入到你需要它们的json中。在这种情况下,恕我直言,这将是矫枉过正。
但是对于参考,例如:
杰伦
{
tournaments:[
{
name: "tournamentA",
events: [
{
day: "day1",
outcomes:[
{
name: "outcomeTypeA",
cssClass: function(){
return "classA";
}
},
{
name: "outcomeTypeB",
cssClass: function(){
return "classB";
}
},
{
name: "outcomeTypeC",
cssClass: function(){
return "classC";
}
}
]
},
{
//another event of tourA
}
]
},
{
//tournamentB, etc .
}
]
}
由于这会重复很多,因此您可以将其外部化为帮助程序
JAVASCRIPT:
var myHelper = function(param){
return "class"+param;
}
杰伦
.... {
name: "outcomeTypeA",
cssClass: function(){
return myHelper("A");
}
},....
或者通过从"名称"推断可能更好
.... {
name: "outcomeTypeA",
cssClass: function(){
return myHelper(this); //this refers to object literal on this level
//containing 2 properties: 'name' and 'cssClass'
}
},....
然后:
var myHelper = function(obj){
var param = obj.name.substring(obj.name.length-2); //get last char from 'name'-prop
return "class"+param;
}