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

如何在Meteor中的不同模板之间传递反应变量?,meteor,meteor-blaze,Meteor,Meteor Blaze,我有两个单独的模板: 我有两个与这两个模板关联的JavaScript文件 我想要的是,如果在MusicControl模板上发生事件(“单击”事件),它将设置某种全局变量(但不是会话变量),以便我可以在另一个模板中作为辅助函数访问它 如何在Meteor中实现反应式Dict 不用担心,我已经在各自的js中为这两个模板定义了帮助函数 还有一件事,这些是相互独立的,我只想通过使用某种全局变量来收听上的事件。在这种情况下,我通常使用父对象拥有的被动变量,其工作是在其子对象之间进行协调。我不会在这里使用

我有两个单独的模板:


我有两个与这两个模板关联的JavaScript文件

我想要的是,如果在MusicControl模板上发生事件(
“单击”
事件),它将设置某种全局变量(但不是
会话
变量),以便我可以在另一个模板中作为辅助函数访问它

如何在Meteor中实现反应式Dict

不用担心,我已经在各自的js中为这两个模板定义了帮助函数


还有一件事,这些
是相互独立的,我只想通过使用某种全局变量来收听
上的事件。

在这种情况下,我通常使用父对象拥有的被动变量,其工作是在其子对象之间进行协调。我不会在这里使用全局变量

下面是一些基本知识。Child1设置共享变量,Child2使用它。父母拥有它。Child1和Child2彼此没有关系

<template name="Parent">
    {{> Child1 sharedVarSetter=getSharedVarSetterFn}}
    {{> Child2 sharedVar=sharedVar}}
</template>
在Child1中的某个地方(助手、事件处理程序,您有什么):


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

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

HTML(实际上是空格键)


{{>Child1 sharedVar1=sharedVar}
{{>Child2 sharedVar2=sharedVar}
JavaScript

从'meteor/ReactiveVar'导入{ReactiveVar};
//只需初始化变量。也可以在模板的范围内。
var myReactiveVar=新的ReactiveVar();
Template.Parent.helpers({
//这是将发送给Child1和Child2的内容。
sharedVar:函数(){
返回myReactiveVar;
}
});
Template.Child1.helpers({
myValue:函数(){
//与往常一样,这将是被动的。
返回Template.instance().data.sharedVar1.get();
}
});
Template.Child2.events({
“事件选择器”:函数(事件、模板){
//此更改将触发Child1 myValue helper的自动运行。
template.data.sharedVar2.set(myNewValue);
}
});
(当然,您可以将这些文件拆分为多个JS文件)


使用Meteor 1.6.1和Blaze的演示应用程序示例:

child1代码看起来太复杂了…IIRC,在两个模板之间共享一个
ReactiveVar
,一个设置,另一个设置,就足够了scenario@ghybs,这就是我正在做的,在两个(子)模板之间共享一个反应式var。那么问题总是:谁拥有它?在这里,是父母,他们的好处是孩子们需要的东西被传下来,而不是孩子们去寻找他们需要的东西。例如,如果是全球性的,那么孩子们就会伸出援手。从设计的角度来看,我喜欢从父级传递到子级。另一种常见的模式是,子级分派一个事件,由父级捕获,然后父级确保将值传递给另一个子级。但就我所见,这并不是流星的模式。因此,我开始让家长将回调函数传递给一个孩子。IIRC只需在两个孩子之间共享家长的
ReactiveVar
,然后一个设置它,另一个获得它,
autorun
很高兴…我现在没有Blaze项目要检查,但它应该可以工作…@ghybs你应该把它写下来作为答案。我使用上面的模式处理更复杂的事情,所以这是我的默认方式。但是你的是一个更简单的解决OP问题的方法。这在Meteor 1.6.1中对我不起作用,因为sharedVar1.get()在Child1@Houseman当前位置虽然这个答案已经有将近1年的历史了,但我只是在Meteor 1.6.1和中进行了测试。如果您在实施过程中需要帮助,请随时提出新问题。感谢您付出的额外努力!我能得到它working@Houseman谢谢你的反馈,我很高兴你的应用程序能正常工作!
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);
});
let fn = template.sharedVarSetterFn.get();

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