1

我有一个 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)
}

这是正确的方法吗?还是我犯了一些简单的错误?我一直喜欢以这种方式使用事件映射,因为它仅用几行代码就总结了渲染模板的行为。匿名函数可以将列表展开,使其更难阅读,当然它们也不能重用。

4

1 回答 1

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

于 2012-06-26T11:09:38.240 回答