0

现在更新 我尝试在我的应用程序中执行此操作(感谢 Akshat)

//常见的

LANG = 'ru';
Dictionary = new Meteor.Collection("dictionary");

//if server
    Meteor.startup(function () {
    if (Dictionary.find().count() === 0) {
        // code to fill the Dictionary
    }
    });


    Meteor.publish('dictionary', function () {
        return Dictionary.find();
    });
//endif

//客户

t = function(text) {
    if (typeof Dictionary === 'undefined') return text;
    var res = Dictionary.find({o:text}).fetch()[0];
    return res && res.t;
}

    Meteor.subscribe('dictionary', function(){ 
      document.title = t('Let the game starts!'); 
    });

    Template.help.text = t('How to play');

//html

<body>
  {{> help}}
</body>


<template name="help">
    {{text}}
</template>

仍然不能按我们的意愿工作:当模板被渲染时,字典是未定义的。但t('How to play')在控制台中完美运行)

4

1 回答 1

1

Javascript 变量不会在客户端和服务器之间被动共享。您必须使用 Meteor Collection 来存储您的数据,例如

if (Meteor.isServer) {

    var Dictionary = new Meteor.Collection("dictionary");

    if(Dictionary.find().count() == 0) {
    //If the 'dictionary collection is empty (count ==0) then add stuff in

        _.each(Assets.getText(LANG+".txt").split(/\r?\n/), function (line) {
            // Skip comment lines
            if (line.indexOf("//") !== 0) {
                var split = line.split(/ = /);
                DICTIONARY.insert({o: split[0], t:split[1]});
            }
        });
    }

}

if (Meteor.isClient) {

    var Dictionary = new Meteor.Collection("dictionary");

    Template.help.text = function() {
        return Dictionary.find({o:'Let the game starts!'});
    }
}

在上面我假设你有autopublish包(默认情况下,当你创建一个包时它就在里面,所以这不应该真的打扰你,但以防万一你删除了)

对于您的文档标题,您将不得不使用稍微不同的实现,因为请记住在运行时不会下载数据Meteor.startup,因为首先下载 html 和 javascript 并且数据是空的,然后数据会慢慢进入(并且然后反应性地填充数据)

于 2013-10-02T13:45:24.283 回答