将参数传递给手把辅助对象

Pass in parameter to handlebars helper

本文关键字:对象 参数传递      更新时间:2023-09-26

所以我有一个非常简单的车把助手-

Handlebars.registerHelper('selectRow', (rowIndex, selectedIds) ->
  console.log 'row index'
  console.log rowIndex
  console.log selectedIds
  isSelected = _.indexOf(rowIndex, selectedIds)
  if isSelected > -1 
    return 'class="row-selected"'
)

我有这个车把代码-

<div class="title">{{ title }}</div>
<hr/>
<table cellspacing="0" cellpadding="0">
  <thead>
    {{#each columns}}
    <th class="col-heading" data-heading="{{ this }}">{{ this }}</th>
    {{/each}}
  </thead>
  <tbody>
    {{#each rows}}
        <tr {{#selectRow @index selected }}>
          {{#each this}}
          <td>
            {{this}}
          </td>
          {{/each}}
        </tr>
      {{/selectRow}}
    {{/each}}
  </tbody>
</table>

所选参数总是未定义的。如果我在其他地方添加一个{{selected}},它会显示一个数组,正如你从下面看到的,它应该是-

data = @model.data()
selected = @model.get('selection').get('selected')
@$el.html(@tableContentsTemplate({
  columns: @model.get('columns')
  rows: data
  title : @model.get('title')
  selected: JSON.stringify(selected)
}))

如何将所选参数正确传递给助手?

您在Handlebars each循环中使用selected变量,所以我认为selected不在作用域中。

我想您只是对_.indexOf的工作方式有点困惑。来自精细手册:

_.indexOf(array, value, [isSorted]) 的索引

返回可在数组中找到的索引,如果阵列不存在值,则返回-1

因此,您要搜索的数组selectedIds应该是第一个参数,而要搜索的元素是第二个参数。也许你的意思是说:

isSelected = _.indexOf(selectedIds, rowIndex)

或更好(IMO):

isSelected = _(selectedIds).indexOf(rowIndex)

我通常发现使用_()函数会产生更清晰的代码。

另外,{{#selectRow @index selected }}不应该是{{selectRow @index selected}}吗?一个前导#应该引入一个块,但您的辅助对象并不是作为块辅助对象编写的。

一旦上述两个问题都得到解决,对我来说,明智的事情似乎正在发生:http://jsfiddle.net/ambiguous/pkVZc/1/