我刚刚开始学习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?
}
});
如何在客户端使用这些对象?
答案 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)
这里有两个核心要点:
Translates
集合。除此之外,您的查询和数据模型存在一些问题。
通过定义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({})
,您将获得一个游标,该游标将迭代已为您的订阅客户发布的所有文档。