2015-12-18 3 views
0

У меня есть флажок, который при нажатии вызывает функцию, которая выполняет запрос GET. На основе выбора я хочу отобразить дополнительные флажки на одной странице. В настоящее время это код, который я до сих пор:Обновить раздел страницы с помощью EJS и Express

стороне клиента

function selectedHouse(house) 
{ 
    if(house.checked){ 
     $.get('/', {data: house.value}); 
    } 
} 

стороне сервера

var routing = function (nav, houses) { 
    router.route('/') 
     .get(function (req, res) { 
      var rooms = []; 
      rooms = getRooms(req.query.data); 
      console.log(rooms); 

      res.render('index', { 
       title: 'Independent cleaner', 
       nav: nav, 
       houses: houses, 
       roomsForHouse: rooms 
      }); 
     }); 
    return router; 
}; 

В первый раз загружает страницу, он загружает с правильным названием, нав и дома. Когда функция выполняется на стороне клиента, я возвращаю связанные комнаты для дома, и я пытаюсь заполнить переменную roomForHouse, которую я показываю на виду.

Проблема в том, что представление не отображает переменную roomForHouse. Таким образом, запрос GET вызывается после загрузки страницы и второй раз, когда функция выполняется. Может ли это быть достигнуто?

ответ

2

Это немного сложнее. Для этого вам нужно использовать ajax. EJS - это серверные шаблоны (как вы их используете), поэтому вы хотите использовать jQuery для совершения вызова и обновления уже сделанной страницы.

Ваш сервер будет нуждаться в маршруте, который поставляет данные JSON. Прямо сейчас вы просматриваете всю страницу. Итак:

app.get('/rooms/:id', function (req, res) { 

    // Get the house info from database using the id as req.params.id 
    ... 

    // Return the data 
    res.json({ 
    rooms: 2 
    ... 
    }); 
}); 

Client

Использование JQuery сделать вызов вашим JSon маршрут, когда пользователь выбирает дом.

function selectedHouse(house) 
{ 
    if(house.checked){ 
     // Pass some identifier to use for your database 
     $.ajax({ 
     type: 'GET', 
     url: '/rooms/' + house.id, 
     success: function(data) { 
      // Update the element - easiet is to use EJS to make sure each house has an id/class with the id in it 
      // Given an ID of 2 this says find the div with class house_2 and updates its div with class room to the number of rooms 
      $('.house_' + house.id + ' .rooms').text(data.rooms); 
     }); 
    } 
} 

Это скорее псевдо-код, чем любой, но должен поставить вас на правильный путь.

+0

Ваше решение должно работать, и мне оно нравится. Я думаю, что вопрос сейчас, я делаю это правильно? Если бы вы начали с нуля, как бы вы это сделали. Это мой любимый проект, так что нет никакого реального эффекта, если я начну с нуля. Я все еще хочу использовать node.js и выразить. –

+0

Также вы ответили на мой вопрос, поэтому я собираюсь отметить его как решенный, хотя я хотел бы посмотреть, как бы вы это сделали. –

+0

Вы делаете это правильно. Я хотел бы, чтобы мой маршрут '/' отображал страницу индекса со списком всех ваших домов из базы данных, а затем использовал идентификатор каждого из них, который вы можете получить по требованию. Итак, 2 маршрута. Конечно, это зависит от ваших фактических данных. Традиционно можно получить разбитый список домов (только основы для каждого дома), за которым следует подробный обзор для каждого (номера плюс все остальные детали). Но суть в этом правильна. Ты на правильном пути. – cyberwombat

0

res.render косяк вид повторно вызывать для обновления страницы во второй раз, вам необходимо использовать JavaScript, чтобы заменить HTML .Это не является хорошим решением

$.get("/",function(html){ 

document.open(); 

document.write(html); 

document.close(); 

}); 

Для лучшего вы должны использовать другой маршрутизатор для визуализации DOM вы хотите изменение

+0

Можете ли вы предоставить базовый пример того, что должен быть код клиента, и код на стороне сервера –

+0

Я отредактировал свой вопрос – trquoccuong

Смежные вопросы