【问题标题】:Meteor - handling events in nested templates... without polluting 'Session' variableMeteor - 处理嵌套模板中的事件......不污染“会话”变量
【发布时间】:2015-05-19 05:32:14
【问题描述】:

我现在已经多次遇到这种情况,我意识到我对处理它的“流星/正确”方式并不十分自信。

假设我有一个包含多个部分的表单 - 每个部分都由一个模板表示 - 在每个部分中都有更多的模板表示例如。日期选择器等。

<template name='myForm'>
    {{>partOne}}
    {{>partTwo}}
    <button class='submit'>Submit</button>
</template>

<template name='partOne'>
    {{>widget}}
    {{>widget}}
</template>

<template name='widget'>
    <input class='datepicker' />
</template>

我想在用户填写表单时跟踪我的表单 - 在“myForm”模板级别 - 但所有事件都在“小部件”级别发生。

我经常看到的一个解决方案(例如in this SO answer)是将所有内容都放在全局 Session 变量中。像这样

Template.widget.events({
    'click .select' : function(event, template){
        var name = template.data.name;
        Session.set(name, $(event.currentTarget).val());
    }
});

然后在 myForm 我应该做这样的事情

Template.myForm.rendered = function(){
    Tracker.autorun(function(){
        var name = Session.get('name');
        // do something
    });
}

但是随着我的表单变得越来越复杂,我发现这在 myForm 模板级别上确实变得一团糟,同时使用并非真正的应用程序全局数据填充我的 Session 变量。

对于其他人如何处理此问题的任何想法,我将不胜感激!保持模板和小部件模块化,同时仍然能够跟踪父模板触发的事件并对其做出反应...

【问题讨论】:

    标签: meteor


    【解决方案1】:

    你不是唯一一个觉得有什么不对劲的人。这是有很多关于 Blaze 2 的讨论的原因之一。这就是我所做的:

    创建一个应用全局命名空间(例如G = {})。我通常使用应用名称的第一个字母并在 lib/config/_namespace.js 中执行此操作

    将您的收藏放在G.CollectionsG.C

    将你的共享函数放入G.Fx等...

    将您的模板变量放入G.T

    然后,将该变量保存到G.T.varName。这样做时,您可以在rendered 以及eventshelpers 中使用它。作为一项福利,找到所有“全局变量”非常容易,因为它们都在 G 对象中。此外,您现在可以再次“使用严格”。

    然后,保持清洁:

    Template.parentTemplate.destroyed = function() {
      G.T = {};
    };
    

    因此,如果您需要反应性,只需发送ReactiveDict

    Template.parentTemplate.created = function() {
      G.T.RD = new ReactiveDict();
    };
    

    【讨论】:

    • 这不是我用来解决这个特定问题的方法,但仍然感谢您提供非常有用的答案。在流星文献中几乎没有关于命名空间的信息,我听从了你的一些建议
    【解决方案2】:

    您可以使用文件级ReactiveVarReactiveDict,而不是Session 对象。

    【讨论】:

    • 如果所有小部件都在同一个文件中,这将起作用......但其他包中的小部件将无权访问它
    • 我在客户端和服务器上使用了一个全局变量G = this 来访问全局命名空间,但这不会让你摆脱几个不同的会话变量,这些变量不会持续存在。据我所知,在 Meteor 中没有一种好的方法可以在不使其全球化的情况下共享数据。
    • 我还没有尝试过,但是可以使用Template.parentData 在父模板的数据集上存储一个 ReactiveVar。
    猜你喜欢
    • 2014-11-22
    • 2014-12-11
    • 1970-01-01
    • 2016-07-11
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多