Javascript 如何将函数传递给Meteor模板?

Javascript 如何将函数传递给Meteor模板?,javascript,meteor,Javascript,Meteor,我想插入Meteor模板(一个简单的登录表单),但我想控制表单提交后发生的事情。理想情况下,我希望能够将函数afterLogin()传递给模板。但我很不确定如何做到这一点,如果这是可能的 我最近看到了一个有趣的软件包,我不确定它有多相关。但是本文的目标基本上是使用不同的视图模型渲染视图 有什么想法吗?我目前正在使用一个会话变量,然后在登录后,我检查该会话变量以运行正确的函数,但这很难看,不容易使用。有什么想法吗?首先,我会使用Iron Router在我的应用程序的不同视图中导航,您可以在这里获得

我想插入Meteor模板(一个简单的登录表单),但我想控制表单提交后发生的事情。理想情况下,我希望能够将函数
afterLogin()
传递给模板。但我很不确定如何做到这一点,如果这是可能的

我最近看到了一个有趣的软件包,我不确定它有多相关。但是本文的目标基本上是使用不同的视图模型渲染视图


有什么想法吗?我目前正在使用一个会话变量,然后在登录后,我检查该会话变量以运行正确的函数,但这很难看,不容易使用。有什么想法吗?

首先,我会使用Iron Router在我的应用程序的不同视图中导航,您可以在这里获得:

然后,检查。我会使用类似于:

Template.loginFormTemplate.events({
  'click .loginButton': function() {
    //... if success login ...
    Router.go('nextScreen');
  }
});
[更新1]

在Meteor架构的意义上,我担心尝试将功能传递给Route是一种丑陋的方法

不过,您可以尝试定义一些全局变量,该变量负责侦听和转发路由中的触发事件

var eventHelper = (function () {
    var self = _.extend({
        afterLogin: function () {
            self.trigger('forwardedEvent');
        }}, Backbone.Events);

    return self;
})();


Route1.events({
    'click': function () {
        //... Let's call after login
        eventHelper.afterLogin();
    }
});

eventHelper.on('forwardedEvent',function() {
   // ... 
});
我就是这样做的:

我假设您的登录表单是从父模板中调用的,请使用attributes语法将自定义助手的值传递给登录表单的数据上下文

<template name="parent">
  {{> loginForm options=loginFormOptions}}
</template>
作为库的登录表单代码可以从其数据上下文中读取调用方模板传递的函数,然后使用适当的
this
上下文调用该函数

Template.loginForm.events({
  "submit":function(event,template){
    // ...
    Meteor.loginWithPassword(...,function(error){
      if(error){
        console.log(error);
        return;
      }
      // guard against the existence of the custom afterLogin function
      if(template.data.options && template.data.options.afterLogin){
        // execute the custom function with proper context
        template.data.options.afterLogin.call(template);
      }
    });
  }
});

我用的是铁制路由器。问题是,我想调用传递给模板的任意函数,而不是
Router.go('nextScreen')
。我想您必须传递包装在对象中的函数。
Template.parent.helpers({
  loginFormOptions:function(){
    return {
      afterLogin:function(){
        // we assert that the context is correct :
        // this will print Template.loginForm
        console.log(this.view.name);
      }
    };
  }
});
Template.loginForm.events({
  "submit":function(event,template){
    // ...
    Meteor.loginWithPassword(...,function(error){
      if(error){
        console.log(error);
        return;
      }
      // guard against the existence of the custom afterLogin function
      if(template.data.options && template.data.options.afterLogin){
        // execute the custom function with proper context
        template.data.options.afterLogin.call(template);
      }
    });
  }
});