如何将对象插入流星集合中

时间:2014-02-28 06:04:08

标签: javascript node.js meteor

我刚刚开始学习Meteorjs并且有更多的问题而不是答案。

我想将我的应用程序的翻译存储到临时Collection中,并将Iron Router订阅到其发布。我有一个字典对象,我想插入到集合中。

这是我的方式:

server / translations.js

translations = {
  ru_RU: {
    'value1': 'translation1',
    'value2': 'translation2'
  },

  en_US: {
    'value1': 'translation1',
    'value2': 'translation2'
  }
};

collections / translates.js

Translates = new Meteor.Collection('translations');
Translates.insert(translations);

server / publications.js

Meteor.publish('translations', function (lang) { //<-- how to pass arguments?
    return Translations.find({'translations': lang});
});

router.js

//use iron-router
Router.configure({
    layoutTemplate: 'main',
    notFoundTemplate: 'not-found',
    waitOn: function () { //waiting while data received and starting router job
        return Meteor.subscribe('translations');//<-- how can i use this data?
    }
});

如何在客户端使用这些对象?

2 个答案:

答案 0 :(得分:4)

有一些客户端/服务器放置问题,您似乎也在这里工作,但让我们关注您的问题并缩小问题范围。

定义您的收藏

Translations = new Meteor.Collection('translations');

Bootstrap数据库

if (Meteor.isServer) {
    if (Translations.find({}).count() === 0) {
        Translations.insert({
            'translation' : 'ru_RU',
            'value1': 'translation1',
            'value2': 'translation2'
        });
        Translations.insert({
            'translation': 'en_US',
            'value1': 'translation1',
            'value2': 'translation2'
        });
    }
}

发布

如果您发布带参数的集合

Meteor.publish('translations', function (lang) { //lang argument
    return Translations.find({'translation': lang});
});

<强>订阅

您可以使用此参数订阅

Meteor.subscribe('translations', 'ru_RU'); // pass in the other language code

为了简单起见,我将省略铁路由器,因为您需要做一些事情来设置主模板中的{{yield}}和Router.map - Iron Router Quickstart

模板助手

Template.myTemplate.helpers({
    translations: function() {
        // return all subscribed translations
        return Translations.findOne({});
    }
});

<强>模板

<template name='myTemplate'>
    {{translations.value1}}<br>
    {{translations.value2}}
</template>

答案 1 :(得分:0)

这里有两个核心要点:

  1. 客户端上也存在Translates集合。
  2. 订阅源可以全部在客户端上发布它所发布的文档:无论它们属于哪个集合。您甚至可以返回一组游标,以便从多个集合中发布。

  3. 除此之外,您的查询和数据模型存在一些问题。

    通过定义translations变量,查询Translations.find({'translations': lang});不会找到任何内容,因为它会尝试查找字段translation等于传递的对象的文档。这可能不是你想要的。

    我建议您将translation变量保存以下数据:

    translations = [
      {
        'translation' : 'ru_RU',
        'value1': 'translation1',
        'value2': 'translation2'
      },
      {
        'translation': 'en_US',
        'value1': 'translation1',
        'value2': 'translation2'
      }
    ];
    

    然后您的查询可能会返回您想要的内容。

    另一个建议是Translates.insert(translations);每次服务器运行时都会在表中输入一个对象。这也可能不是你想要的(也许你不是在实际客户端那样做)。解决问题的方法是在开始时检查集合是否为空:

    if (Translation.find({}).count() === 0) Translation.insert(translations);
    

    最后,在订阅时,您可以将变量传递给subscribe函数:

    waitOn: function () {
        return Meteor.subscribe('translations', 
                                  /* user preference here */
                                 this.params.userLanguagePreference
                               );
    }
    

    最后,要访问客户端上的集合,只需使用Translation.find({}),您将获得一个游标,该游标将迭代已为您的订阅客户发布的所有文档。