Можно ли получить доступ к переменной Handlebar через внешний файл. js? - PullRequest
1 голос
/ 02 мая 2020

Я надеюсь, что все хорошо, несмотря на пандемию c, которую мы испытываем прямо сейчас. В настоящее время я занимаюсь школьным проектом и застрял в бесконечном попытке разобраться. Я ищу способ доступа к данным, переданным моим обработчиком маршрута к моему шаблону руля, в отдельный файл javascript.

. См. Прилагаемый код ниже:

index . js (обработчик маршрута, который передает переменные моему шаблону руля)

app.get('/', function(req, res){
    if (req.session.loggedin){
        professorModel.aggregate([{ $sample: { size: 3 } }]).then(function(qvProfs) {
            reviewModel.find({}).populate('profRef').populate('studentRef').sort({_id:-1}).limit(10).exec(function(err,mostRecent) {
                collegeModel.find({}).exec(function(err, col){
                    var colleges = [];
                    var reviews = [];

                    col.forEach(function(document){
                        colleges.push(document.toObject());
                    });

                    mostRecent.forEach(function(document){
                        reviews.push(document.toObject());
                    });

                    res.render('frontend/home',{
                        studentRef: req.session.studentRef,
                        idNum: req.session.idNum,
                        colleges: colleges,
                        data: qvProfs,
                        review: reviews,
                        title: 'Home',
                    });
                });
            });
        });
    }
    else{
        res.redirect('/login')
    };
});

Основной макет (макет, используемый 'frontend / home')

<script src="/js/script.js"></script>

script. js (внешний. js файл для манипулирования html)

    var newReview = {
      profName: $('#revProfName').find(":selected").text(),
      profCourse: $('#revProfCourse').find(":selected").text(),
      studentRef: "{{req.session.studentRef}}",
      studentId: "{{req.session.idNum}}",
      reviewContent: $("textarea#revContent").val()
    };

Каждый раз, когда я выполняю console.log (newReview), я всегда получаю {{req.session.studentRef}} и ​​{{req.session.idNum}}, а не фактическое значение. Любая помощь будет принята с благодарностью. Спасибо всем!

1 Ответ

1 голос
/ 02 мая 2020

хорошо, похоже, нет прямого способа заставить его работать, поскольку руль не интерпретирует отдельные файлы js, но здесь есть хак.

1-й, вам нужно будет передать область окна данных внутри файла просмотра. для этого сначала зарегистрируйте вспомогательную функцию, если вы передаете данные объекта json / javascript.

дополнительную информацию по этому вопросу можно найти здесь.

hbs.registerHelper('json', function(context) {
    return JSON.stringify(context);
});

2-й шаг: внутри вашего файла представления добавьте данные в область видимости окна.

// if both variables you are sending are objects
window.studentRef = JSON.parse('{{{json studentRef}}}');
window.studentId = JSON.parse('{{{json studentRef}}}');
// if the variables you are sending are int or string
window.studentRef = {{studentRef}};
window.studentId = "{{studentRef}}";

Затем вы можете получить доступ к ним из области видимости windows внутри файла js в приемнике загрузки окна.

// inside your js file
window.addEventListener('load', () => {

    var newReview = {
      profName: $('#revProfName').find(":selected").text(),
      profCourse: $('#revProfCourse').find(":selected").text(),
      studentRef: window.studentRef,
      studentId: window.studentId,
      reviewContent: $("textarea#revContent").val()
    };
})

надеюсь, у вас есть идея достичь этого.

...