2015-05-07 2 views
1

Я новичок в Meteor.js и был бы очень признателен за любую помощь, которую любой мог бы дать по следующим двум вопросам. Я делаю приложение для карточек, где вы нажимаете стрелку, чтобы отобразить следующую флешку. Карточки перетасовываются заранее, и вы проходите через всю колоду, щелкая стрелку.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 проходит на слове, а индекс к более детальному 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? Каков наилучший способ перетасовки колоды каждый раз, когда я перехожу к корневому файлу, или где-нибудь нажимать кнопку тасования?

2) Я использую Session.get/Session.set LOT в файле wordPage.js. Есть ли способ сохранить эти функции для доступа как к помощникам wordPage, так и к событиям? Я пытался сделать что-то вроде этого:

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

вне помощников и событий блокировать, а затем просто пытаюсь использовать слово (индекс). Но похоже, что он работает только, если я делаю слово глобальной переменной.

Большое спасибо.

ответ

2

Когда у вас возникли проблемы с определением области охвата (где я могу определить, как это использовать, теперь мой код беспорядок Session везде, где я не знаю, как я манипулирую своими данными, и когда я пытаюсь чтобы реорганизовать что-то, что я хочу сжечь на моем компьютере) у вас есть простое решение:
A 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 коллекции при первом использовании, ...


* Нет var утверждения не означает, что переменная пакета в области видимости и может быть экспортированы , затем импортируется либо глобально с meteor add, либо в другой области с api.use.

+0

Спасибо большое. Кажется, я не могу заставить эти методы работать, и мое приложение не обнаруживает коллекции слов: 1) Может ли api.export идти в нижней части файла cards.js? 2) Я объявляю «Words = new Mongo ...» в lib/collection, поэтому я должен снова объявлять здесь? 3) Чтобы получить доступ к словамAccessor, я должен просто набрать словаAccessor.shuffledWords в любом месте приложения правильно? Еще раз спасибо. –

+1

1) 'api.export' экспортирует переменные в соответствии с их именем после загрузки всего файла. 2) Да, или объявить его раз и навсегда в пакете (но вы можете запускать проблемы с областью, если вы не экспортировали глобально «Слова»!), Объявив его дважды, это не так уж плохо, проблема в этом случае (все равно та же коллекция за ней). 3) Если вы экспортировали 'wordsAccessor' и импортировали его глобально (с помощью команды' meteor add' или 'api.imply' в другом пакете), тогда вы можете просто использовать' wordsAccessors' всюду. –

+0

Gotcha. Я прочитал немного больше, и для тех, кто рисковал на этом посту, чтение о том, как Connect.js и Express.js построены поверх узла, может помочь понять, что такое весь объект «api». Спасибо Kyll. –

0

Просто, чтобы увеличить ответ выше пропавшую деталь: api.export('WordsAccessor'); нужно положить в package.js:

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