Meteor.js: 在事件和助手中重用方法和函数
Meteor.js: Reusing methods and functions in events and helpers
我是 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通过上面的方法将word和index传递给更详细的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) 我想在每次加载页面时随机播放抽认卡,我能弄清楚如何轻松做到这一点的唯一方法(即不随机播放整个 MongoDB 数据库)是保存通过 Sessions 变量将整个抽认卡放在一个数组上。如何在我不使用 Sessions 变量的情况下实现某些东西?每次我进入 root 或单击某处的洗牌按钮时洗牌的最佳方式是什么?
2) 我在 wordPage.js 文件中大量使用 Session.get / Session.set。有什么方法可以保存这些函数以便在 wordPage 帮助器和事件中都可以访问吗?我试过这样做:
var word = function ( index ) { return Session.get ( 'wordArray' ) [index]; }
在助手和事件块之外,然后只是尝试使用 word(index)。但它似乎只有在我将 word 设为全局变量时才有效。
在此先致谢。
当你遇到关于范围的严重问题时(我在哪里定义它,我如何使用它,好吧,现在我的代码到处都是乱七八糟的 Session
我不知道我是如何操纵我的数据,当我尝试重构某些东西时我想烧掉我的电脑)你有一个简单的解决方案:
package.
一个包可以让你清楚地定义你的数据,并在你需要的地方小心地导入它。您可以定义无痛的唯一访问器(而不是到处都是 Session
的东西)。您可以一劳永逸地定义您的数据是什么,如何访问、更改、删除、打乱...
这是您的用例的样板文件。
meteor create --package cards
删除测试。在 package.js
中,删除 onTest
回调,您暂时不需要它。您将需要 underscore
和 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);
});
}
};
最后,export 访问者:
api.export('WordsAccessor');
有了这种模式,你几乎可以做任何你想做的事。您可以创建一个单词数组以避免一直碰到 minimongo,在首次使用时填充 Words
集合,...
*No var
语句意味着该变量是包范围的并且可以导出,然后使用 meteor add
全局导入或使用 api.use
.[= 在另一个包范围中导入29=]
只是为了加强上面缺少细节的答案:
api.export('WordsAccessor');
需要放入package.js:
Package.onUse(function(api) {...
我是 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通过上面的方法将word和index传递给更详细的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) 我想在每次加载页面时随机播放抽认卡,我能弄清楚如何轻松做到这一点的唯一方法(即不随机播放整个 MongoDB 数据库)是保存通过 Sessions 变量将整个抽认卡放在一个数组上。如何在我不使用 Sessions 变量的情况下实现某些东西?每次我进入 root 或单击某处的洗牌按钮时洗牌的最佳方式是什么?
2) 我在 wordPage.js 文件中大量使用 Session.get / Session.set。有什么方法可以保存这些函数以便在 wordPage 帮助器和事件中都可以访问吗?我试过这样做:
var word = function ( index ) { return Session.get ( 'wordArray' ) [index]; }
在助手和事件块之外,然后只是尝试使用 word(index)。但它似乎只有在我将 word 设为全局变量时才有效。
在此先致谢。
当你遇到关于范围的严重问题时(我在哪里定义它,我如何使用它,好吧,现在我的代码到处都是乱七八糟的 Session
我不知道我是如何操纵我的数据,当我尝试重构某些东西时我想烧掉我的电脑)你有一个简单的解决方案:
package.
一个包可以让你清楚地定义你的数据,并在你需要的地方小心地导入它。您可以定义无痛的唯一访问器(而不是到处都是 Session
的东西)。您可以一劳永逸地定义您的数据是什么,如何访问、更改、删除、打乱...
这是您的用例的样板文件。
meteor create --package cards
删除测试。在 package.js
中,删除 onTest
回调,您暂时不需要它。您将需要 underscore
和 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);
});
}
};
最后,export 访问者:
api.export('WordsAccessor');
有了这种模式,你几乎可以做任何你想做的事。您可以创建一个单词数组以避免一直碰到 minimongo,在首次使用时填充 Words
集合,...
*No var
语句意味着该变量是包范围的并且可以导出,然后使用 meteor add
全局导入或使用 api.use
.[= 在另一个包范围中导入29=]
只是为了加强上面缺少细节的答案:
api.export('WordsAccessor');
需要放入package.js:
Package.onUse(function(api) {...