Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor.js:在事件和助手中重用方法和函数_Javascript_Meteor_Meteor Helper - Fatal编程技术网

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

Javascript Meteor.js:在事件和助手中重用方法和函数,javascript,meteor,meteor-helper,Javascript,Meteor,Meteor Helper,我是Meteor.js的新手,非常感谢任何人在以下两个问题上给予我的帮助。我正在制作一个抽认卡应用程序,您可以单击箭头显示下一个抽认卡。抽认卡是预先洗牌的,您可以通过单击箭头来浏览整个卡片组 Router.route ( '/', function () { Session.set ('wordArray', _.shuffle( Words.find().fetch() ) ); Session.set ( 'index', 0 ) this.render('wordP

我是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>
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);
        }
    }
} )
在helpers和events块之外,然后尝试使用word(索引)。但它似乎只有在我将word作为全局变量时才有效


提前非常感谢。

当您在范围界定方面遇到重大问题时(我在哪里定义它,如何使用它,好了,现在我的代码到处都是
会话
,我不知道我是如何处理数据的,当我试图重构一些我想烧掉我的计算机的东西时),您有一个简单的解决方案:
A

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


这是您的用例的样板

meteor create --package cards
删除测试。在
package.js
中,删除
onTest
回调,您现在不需要它。您需要
下划线
mongo
,因此将它们添加到
onUse
回调中:

api.use('underscore');
api.use('mongo');
现在,在您的
cards.js
fresh文件中:

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,在第一次使用时填充
单词集



*无
var
语句意味着变量是包范围内的变量,可以导出,然后使用
meteor add
全局导入,或者使用另一个包范围导入。

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

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

谢谢。我似乎无法让这些方法正常工作,而且我的应用程序没有检测到单词集合:1)api.export是否位于cards.js文件的底部?2) 我在lib/collections中声明“Words=newmongo…”,那么我应该在这里再次声明吗?3) 要访问wordsAccessor,我应该在应用程序中的任意位置键入wordsAccessor.shuffledWords,对吗?再次感谢。1)
api.export
在加载整个文件后,根据变量的名称导出变量。2) 是的,或者在包中一次性声明它(但是如果您没有全局导出
Words
!,则可能会出现范围问题),在这种情况下,两次声明它不是一个太糟糕的问题(它后面仍然是同一个集合)。3) 如果您已经导出了
wordsAccessor
并全局导入了它(使用另一个包中的
meteor add
命令或
api.implient
),那么是的,您可以在任何地方使用
wordsAccessor
。明白了。我做了更多的阅读,对于那些在这篇文章中冒险的人来说,阅读Connect.js和Express.js是如何构建在Node之上的可能有助于理解整个“api”对象是什么。谢谢你,凯尔。
Package.onUse(function(api) {...