将命名函数传递给事件映射

时间:2012-06-25 23:14:51

标签: meteor

我有一个包含以下内容的Meteor模板:

{{#with selected_recipe}}
  {{>recipe}}
{{/with}}

在我的代码(Coffeescript)中,我想从我的事件映射(Backbone-style)中按名称调用函数:

Template.recipe.events = {
  'click #btn-edit-recipe': 'editRecipe'
}

editRecipe = (event) ->
  console.log @  #should log the selected_recipe object
  #edit recipe

然而,这失败了。当我点击配方模板中的我的按钮时,我得到Uncaught TypeError: Object editRecipe has no method 'call' (liveui.js:651)我从Backbone学习了事件地图,也许Meteor是不同的。我可以使用它:

Template.recipe.events = {
  'click #btn-edit-recipe': -> editRecipe.call(@, event)
}

这是正确的方法吗?还是我做了一些简单的错误?我总是喜欢以这种方式使用事件贴图,因为它只用几行总结了渲染模板的行为。匿名函数可以将列表分散开来,使其更难阅读,当然它们也不可重复使用。

1 个答案:

答案 0 :(得分:0)

您正在做什么(后面的事件定义指向一个函数)是正确的。 具有值作为函数名称(字符串)的事件映射是特定于主干的模式。流星不支持它。

  

我一直喜欢这种方式使用事件地图,因为它总结了   渲染模板的行为只需几行。

但你可以通过这样的方式实现类似的功能:

Template.recipe.doLogin = function(){};
Template.recipe.requestData = function(){};

//  OR Another way
_.extend(Template.recipe, {
    "openFile":function(){},
    "editRecipe":function(){} 
});

//  now Events
Template.recipe.events {
    'click #btn-edit-recipe': Template.recipe['editRecipe'],
    'click #btn-create-recipe': Template.recipe['createRecipe']
}

就个人而言,我不喜欢事件地图。导致它的映射,开发人员必须手动维护。 修改:工作代码@ https://gist.github.com/3010818