Meteor.js:重用事件和助手中的方法和函数

时间:2015-05-07 01:14:49

标签: javascript meteor meteor-helper

我是Meteor.js的新手,非常感谢任何人在以下两个问题上给予的任何帮助。我正在制作一个flashcards应用程序,你点击箭头显示下一张闪卡。事先将抽认卡洗牌,然后点击箭头浏览整个牌组。

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通过上述方法将单词和索引传递给更详细的tempalte。

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)我想在每次加载页面时对flashcards进行洗牌,我唯一可以弄清楚如何轻松完成这一操作的方法(即,不需要对整个MongoDB数据库进行洗牌)将整个抽认卡保存在数组通过Sessions变量。如何实现我不使用Sessions变量的东西?每次我去root或者在某个地方单击一个随机按钮时,最好的方法是什么?:/ / p>

2)我在wordPage.js文件中使用了Session.get / Session.set一个LOT。有没有什么方法可以保存这些函数,以便在wordPage助手和事件中都可以访问?我尝试过这样的事情:

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

在帮助程序和事件块之外,然后只是尝试使用word(索引)。但它似乎只有在我将单词作为全局变量时才有效。

非常感谢。

2 个答案:

答案 0 :(得分:2)

当你遇到关于作用域的重大问题时(我在哪里定义它,我该如何使用它,好吧,现在我的代码是Session一团糟我到处都不知道我是如何操纵我的数据的当我试图重构一些我想要烧毁我的电脑的东西时)你有一个简单的解决方案:
一个package

一个软件包可以让您清楚地定义数据并在需要的地方仔细导入。您可以定义无痛的唯一访问器(而不是任何地方的Session内容)。您可以一劳永逸地定义您的数据是什么,如何访问,更改,删除,改组,...

这是您的用例的样板。

meteor create --package cards

删除测试。在package.js中删除onTest回调,暂时不需要它。您需要underscoremongo,因此请在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);
    });
  }
};

最后,export访问者:

api.export('WordsAccessor');

有了这种模式,你可以做任何你想做的事情。您可以创建一个单词数组以避免一直触及minimongo,在首次使用时填充Words集合,...

* No var语句表示该变量是包范围的,可以导出,然后使用meteor add全局导入或使用api.use导入另一个包范围。

答案 1 :(得分:0)

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

Package.onUse(function(api) {...