0

目前,我在Meteor.js网站上有一个部分,该部分从Spacebars Template中的反应集合呈现标签。

我做这样简单的事情:

//Coffeescript Template Helper
Template.Albums.tags = ->
    tags = []
    _.each Albums.find({}).fetch(), (albumObject, index) ->
        tags = _.union(albumObject.tags, tags)
    return tags;


<!-- Spacebars Template -->
<template name="tagsTemplate">
    {{#each tags}}
         <li class="interfaceItem">
             <a class="tag" href="{{this}}/">
                 {{this}}
             </a>
         </li>
    {{/each}}
</template>

这按应有的反应方式工作。

我的问题是:

如何更改助手返回的内容并强制更新模板?


我希望根据搜索栏过滤标签的结果。
因此,当用户开始输入tagsSearchBar时,我需要更改tagsTemplate中显示的内容。

我可以进行文本搜索并返回结果,但我不确定如何更新帮助程序然后强制重新加载模板。
如果我尝试简单地更改模板辅助函数的定义,则模板不会更新为新定义(我认为模板不知道辅助函数的定义更改)。

基本上,我试图弄清楚如何为自己的目的进行空格键反应。

感谢大家!

4

1 回答 1

1

如果您真的想更改辅助函数并在这样做时重新渲染模板,一种方法是将函数存储在反应变量中,然后在您的帮助程序中,从反应变量中获取函数并执行它。不幸的是,您不能在 Session 中存储函数,因此您必须使用Deps.Dependency

defaultTagFunction = ->
  tags = []
  _.each Albums.find({}).fetch(), (albumObject, index) ->
      tags = _.union(albumObject.tags, tags)
  return tags

searchTagFunction = ->
  # do something else

tagFunction = ->
tagFunctionDependency = new Deps.Dependency()

Template.Albums.tags = ->
  tagFunctionDependency.depend()
  return tagFunction() # tagFunction.call(this) if you need the data context

setTagFunction = (fn) ->
  tagFunction = fn
  tagFunctionDependency.changed()

setTagFunction(defaultTagFunction)

# later
setTagFunction(searchTagFunction)

但是,可能有更合适的解决方案。如果您在搜索栏中键入内容时界面的行为与搜索栏为空时的界面行为完全不同,您可能需要一个单独的模板,然后决定响应式显示哪个模板。如果行为基本相同,只需将此逻辑添加到现有助手中可能更简单,例如:

Template.Albums.tags = ->
  searchText = Session.get("tagsSearchBar")
  if searchText is ""
    cursor = Albums.find({})
  else
    cursor = Albums.find({tags: searchText})

  tags = []
  _.each cursor.fetch(), (albumObject, index) ->
      tags = _.union(albumObject.tags, tags)
  return tags
于 2014-05-26T07:44:50.220 回答