如何在Meteor中的不同模板之间传递Reactive变量?

时间:2017-03-31 20:06:48

标签: meteor meteor-blaze

我有两个单独的模板:

<template name = "MusicControl">
  <!-- Some Logics here -->
</template>

<template name = "MusicSystem">
  <!-- Some Logics here ("click" event) -->
</template>

我有2个与这2个模板相关联的JavaScript文件。

我想要的是,如果在 MusicControl 模板上发生事件("click"事件),它会设置某种全局变量(但 { {1}}变量)以便我可以在另一个模板中作为辅助函数访问它。

如何在Meteor中的 Reactive-Dict 中实施?

不要担心我在各自的js 中为模板定义了辅助函数。

有一件事,这些Session是彼此独立的,我只是想通过使用某种全局变量来在<templates>上关注&lt; <template 1>

2 个答案:

答案 0 :(得分:2)

@ zim答案的一个简单版本是:

HTML(实际上是Spacebars)

<template name="Parent">
    {{> Child1 sharedVar1=sharedVar}}
    {{> Child2 sharedVar2=sharedVar}}
</template>

<强>的JavaScript

import { ReactiveVar } from 'meteor/reactive-var';

// Just initialize the variable. Could also be within the scope of a template.
var myReactiveVar = new ReactiveVar();

Template.Parent.helpers({
    // This is what will be sent to Child1 and Child2.
    sharedVar: function () {
        return myReactiveVar;
    }
});

Template.Child1.helpers({
    myValue: function () {
        // As usual, this will be reactive.
        return Template.instance().data.sharedVar1.get();
    }
});

Template.Child2.events({
    'event selector': function (event, template) {
        // This change will trigger an autorun of Child1 myValue helper.
        template.data.sharedVar2.set(myNewValue);
    }
});

(当然你可以将它们分成几个JS文件)

使用Meteor 1.6.1和Blaze的演示应用程序示例:https://github.com/ghybs/meteor-blaze-templates-share-data

答案 1 :(得分:1)

对于这种情况,我通常使用父母拥有的反应变量,其作用是在其子项之间进行协调。我不会在这里使用全局变量。

以下是基础知识。 Child1设置共享var,Child2使用它。父母拥有它。 Child1和Child2彼此没有任何关系。

<template name="Parent">
    {{> Child1 sharedVarSetter=getSharedVarSetterFn}}
    {{> Child2 sharedVar=sharedVar}}
</template>

JS:

Template.Parent.onCreated(function() {
    this.sharedVar = new ReactiveVar();
});

Template.Parent.helpers({
    sharedVar() {
        return Template.instance().sharedVar.get();
    },

    getSharedVarSetterFn() {
        let template = Template.instance();

        return function(newValue) {
            template.sharedVar.set(newValue);
        }
    }
});

Template.Child1.onCreated(function() {
    this.sharedVarSetterFn = new ReactiveVar(Template.currentData().sharedVarSetter);
});

和Child1中的某个地方(帮手,事件处理程序,你有什么):

let fn = template.sharedVarSetterFn.get();

if (_.isFunction(fn)) {
    fn(newValue);
}

在这里,我只展示了1个共享变量。但是如果你有多个,反应性的dict可以以相同的方式工作。