1

我是 Meteor.js 的新手,非常感谢任何人在以下两个问题上提供的任何帮助。我正在制作一个抽认卡应用程序,您可以在其中单击箭头以显示下一张抽认卡。抽认卡是事先洗好的,你可以通过点击箭头浏览整个牌组。

Router.route ( '/', function () {
    Session.set ('wordArray', _.shuffle( Words.find().fetch() ) );
    Session.set ( 'index', 0 )
    this.render('wordPage');
})

我的wordPage模板如下:

<template name="wordPage">
    <div class="post">
      <div id = "arrow-right" ></div>
      {{ > wordItem word index }}
    </div>
</template>

我的 wordPage.js 如下:

Template.wordPage.helpers ({
    word: function ( index ) {
        return Session.get ( 'wordArray' ) [ index ] ;
    },

    index: function () { return Session.get ( 'index' ); },
})

wordPage 通过上述方法将单词和索引传递给更详细的模板。

Template.wordPage.events ( { 
    "click #arrow-right": function ( e ) {
        if ( Session.get ('index') < Session.get ('wordArray').length-1 ) {
            console.log(Session.get('index'));
            Session.set ( 'index', Session.get ( 'index' ) + 1);
        }
    }
} )

我的两个问题:

1)我想在每次页面加载时对抽认卡进行洗牌,而我能弄清楚如何轻松做到这一点的唯一方法(即,不洗牌整个 MongoDB 数据库)是通过将整个抽认卡牌组保存在一个数组中会话变量。在我不使用 Sessions 变量的情况下,如何实现一些东西?每次我进入根目录或单击某处的洗牌按钮时,洗牌的最佳方法是什么?

2) 我在 wordPage.js 文件中大量使用 Session.get / Session.set。有什么方法可以保存这些函数以便在 wordPage 助手和事件中都可以访问?我试着做这样的事情:

var word = function ( index ) { return Session.get ( 'wordArray' ) [index]; }

在 helpers 和 events 块之外,然后只是尝试使用 word(index)。但它似乎只有在我将 word 设为全局变量时才有效。

提前非常感谢。

4

2 回答 2

2

Session当您在范围界定方面遇到严重问题时(我在哪里定义它,我如何使用它,好吧,现在我的代码到处都是一团糟烧毁我的电脑)你有一个简单的解决方案:
一个

一个包可以让你清楚地定义你的数据,并在你需要的地方小心地导入它。您可以轻松地定义唯一的访问器(而不是Session随处可见的东西)。您可以一劳永逸地定义您的数据是什么,如何访问、更改、删​​除、改组......


这是您的用例的样板。

meteor create --package cards

删除测试。在package.js, 删除onTest回调,你现在不需要它。您将需要underscoreand mongo,因此将它们添加到onUse回调中:

api.use('underscore');
api.use('mongo');

现在在你的cards.js新文件中:

Words = new Meteor.Collection('words'); //Notice the absence of var*
WordsAccessor = {
  get shuffledWords() {
    return _.shuffle( Words.find().fetch() );
  },
  wordFromIndex : function(index) {
    return Words.find().fetch()[index];
  },
  addWords : function(words) {
    words.forEach(function(word) {
      Words.insert(word);
    });
  }
};

最后,导出访问器:

api.export('WordsAccessor');

使用这种模式,您几乎可以做任何您想做的事情。您可以创建一组单词以避免一直碰到 minimongo,Words在第一次使用时填充集合,...


*没有var声明意味着该变量是包作用域的,可以导出,然后使用全局meteor add或在另一个包作用域中导入api.use

于 2015-05-07T11:52:14.863 回答
0

只是为了增强上面缺少细节的答案: api.export('WordsAccessor');需要放入 package.js 中:

Package.onUse(function(api) {...
于 2016-04-18T11:42:01.490 回答