我有一个包含以下内容的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)
}
这是正确的方法吗?还是我做了一些简单的错误?我总是喜欢以这种方式使用事件贴图,因为它只用几行总结了渲染模板的行为。匿名函数可以将列表分散开来,使其更难阅读,当然它们也不可重复使用。
答案 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