我试图在一个句柄模板中的数组中指定一个项目的索引:
{ people: [ {"name":"Yehuda Katz"}, {"name":"Luke"}, {"name":"Naomi"} ] }
用这个:
<ul id="luke_should_be_here"> {{people[1].name}} </ul>
如果上面是不可能的,我将如何编写一个助手,可以访问数组中的特定项目?
试试这个:
<ul id="luke_should_be_here"> \{\{people.1.name}} </ul>
下面的在索引前加一个点就像预期的那样工作。在这里,当索引后跟另一个属性时,方括号是可选的:
\{\{people.[1].name}} \{\{people.1.name}}
然而,方括号是要求在:
\{\{#with people.[1]}} \{\{name}} \{\{/with}}
在后者中,使用不带方括号的索引号将得到一个:
Error: Parse error on line ...: ... \{\{#with people.1}} -----------------------^ Expecting 'ID', got 'INTEGER'
顺便说一句:括号(也)用于segment-literal语法,以引用实际的标识符(而不是索引号),否则这些标识符是无效的。更多细节在什么是有效的标识符?中
(用YUI中的手柄测试)
你现在可以使用get帮助器来实现:
get
(get people index)
尽管如果你得到一个关于索引需要是字符串的错误,请执行:
(get people (concat index ""))
如果未记录的功能并不是你的游戏,你也可以采用同样的方法:
Handlebars.registerHelper('index_of', function(context,ndx) { return context[ndx]; });
然后在模板中
\{\{#index_of this 1}}\{\{/index_of}}
在我得到之前,我写了上面的内容
this.[0]
如果不自己写帮手,我不认为有人会用把手走得太远。
如果你想第一个/最后一个取,请试试这个。
\{\{#each list}} \{\{#if @first}} <div class="active"> \{\{else}} <div> \{\{/if}} \{\{/each}} \{\{#each list}} \{\{#if @last}} <div class="last-element"> \{\{else}} <div> \{\{/if}} \{\{/each}}
如果数组没有被命名(只有数组被传递给模板),也可以使用下面的语法:
<ul id="luke_should_be_here"> \{\{this.1.name}} </ul>
\{\{#each array}} \{\{@index}} \{\{/each}}
当你使用each在数组中循环时,如果你想在当前项的上下文中访问另一个数组,你可以这样做。
each
下面是示例数据。
[ { name: 'foo', attr: [ 'boo', 'zoo' ] }, { name: 'bar', attr: [ 'far', 'zar' ] } ]
下面是获取attr数组中第一项的句柄。
attr
\{\{#each player}} <p> \{\{this.name}} </p> \{\{#with this.attr}} <p> \{\{this.[0]}} </p> \{\{/with}} \{\{/each}}
这将输出
<p> foo </p> <p> boo </p> <p> bar </p> <p> far </p>
如果你想使用动态变量
这行不通:
\{\{#each obj[key]}} ... \{\{/each}}
你需要做的是:
\{\{#each (lookup obj key)}} ... \{\{/each}}
参见句柄查找助手和车把子表达式。
在我的例子中,我想访问一个自定义helper中的数组,
\{\{#ifCond arr.[@index] "foo" }}
这并没有起作用,但是@julesbou建议的答案起作用了。
工作代码:
\{\{#ifCond (lookup arr @index) "" }}
希望这能有所帮助!欢呼。