1

以下を含む Meteor テンプレートがあります。

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

私のコード (Coffeescript) では、イベント マップ (バックボーン スタイル) から名前で関数を呼び出したいと考えています。

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

あなたがしていること(イベント定義が関数を指している後のもの)は正しいです。値を関数名(文字列)とするイベントマップは、バックボーン固有のパターンです。Meteor はサポートしていません。

レンダリングされたテンプレートの動作を数行で要約できるので、私はいつもこの方法でイベント マップを使用するのが好きでした。

ただし、次のようなことを行うことで、同様の機能を実現できます。

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 に答える