按变量名称选择集合:window [type]不起作用

时间:2016-06-03 19:49:11

标签: javascript mongodb meteor ecmascript-6

我需要动态帮助器来获取游标。这意味着,用户可以更改集合 - 通过单击事件 - 用于获取列表。 但是在console.log我的undefined获得了window[type]。我做错了什么?

因此article.find()可行,但window[type]不...

进口/ API /示例/ index.js

export const article = new Mongo.Collection('articles');
export const images = new Mongo.Collection('images');

进口/ API /示例/客户端/ example.js

import { article, images } from '../';

Template.example.helpers({
    list() {
        const type = Template.instance().section.get();
        console.log(type, window[type]); // result: 'article', undefined
        return window[type].find(); // <- therefore this is NOT working
    }
});

Template.example.onCreated(function() {
    this.section = new ReactiveVar('article');
});

Template.example.events({
    'click .target': function(event, template) {
        const   $this = $(event.currentTarget),
                type  = $this.attr('data-type');

        template.section.set(type);
    }
});

2 个答案:

答案 0 :(得分:1)

这违背了Python的禅宗(“明确比隐含更好”),但这里有足够的合理性。

您可以使用import * as name from "module-name"变量来获取所有集合(前提是它们是从该文件导出的唯一内容,否则应该是显式的)。

import * as collections from '../index'; //collections includes all of your collections

Template.example.helpers({
    list() {
        const type = Template.instance().section.get();
        return collections[type].find();
    }
});

可以得到你想要的东西。

答案 1 :(得分:0)

window对象只包含全局变量作为属性。

但是,JavaScript模块隐式赋予变量绑定的范围。并且,只有全局范围可以自动作为变量访问。

您可以使用括号语法object[property],但您需要建立包含articleimages的其他对象。

import { article, images } from '../';

const collections = { article, images };

// ...

或者,您可以使用import * as name导入所有已命名的导出:

import * as collections from '../';

// ...

然后,使用该对象按type查找:

Template.example.helpers({
    list() {
        const type = Template.instance().section.get();
        console.log(type, collections[type]);
        return collections[type].find();
    }
});