2

我是小胡子的新手,这是我正在尝试的第一个项目。我将它与 kohana 3.2 和 Kostache 模块以及 mustache 的 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>";
}

它会在输出之前通过 url_encode 传递它,这样我就可以得到

&lt;td&gt;aa&lt;/td&gt;

那可以修吗?

4

2 回答 2

1

您可以尝试在视图模型中使用类似于以下的功能:

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}}
于 2012-07-25T00:30:32.463 回答
0

Mustache 是无逻辑的,这意味着您想要的所有逻辑(除了简单的存在检查和循环)都应该通过将逻辑包含在您用作输入的 JSON 中来完成。

基本上,您需要将所有变量(例如 css 类)编码到 json 中。

按照您的示例,请参阅下面的 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 中。在这种情况下,虽然这将是矫枉过正恕我直言。

但对于 ref 类似:

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;
 }  

JSON

 .... {
        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;
 }
于 2012-07-09T17:10:03.257 回答