Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.07.2015, 18:37
Аватар для Lemme
Профессор
Отправить личное сообщение для Lemme Посмотреть профиль Найти все сообщения от Lemme
 
Регистрация: 15.07.2015
Сообщений: 511

Генерация таблицы из JSON
В общем то, решил попробовать написать что-то.

Берем JSON, отображаем его в виде таблицы с постраничной навигацией..
Хотелось бы советов, критики и.т.д. Как можно больше, если, конечно не лень будет смотреть=).

class Table{
	constructor(config){
		this.config = config;
		this.currentPage = 1;
		this.init();
	}
	splitByPages(data){
		let headers 	= data.shift(), //заголовок таблицы (id == Идентификатор и.т.д)
			container 	= document.querySelector(this.config.output.container), // сюда помещаются все данные
			pages		= [], // матрица страниц
			numPages	= Math.ceil(data.length / this.config.perPage); // подсчет кол-ва необходимых страниц

		// разбиваем все данные по страницам.
		// массив имеет следующий вид: pages[номер страницы] === [[], [], [].....]

		for (let i = 0; i < numPages; i++){
			pages[i] = [];
			for (let j = 0; j < this.config.perPage; j++){
				if (data.length === 0) break;
				pages[i].push(data.shift());
			}
		}

		// записываем информацию о сраницах в localStorage
		localStorage.setItem("pages", JSON.stringify(pages));

		// создаем начальную сруктуру таблицы
		let table 	= document.createElement('table'),
			thead 	= document.createElement('thead'),
			tr 		= document.createElement('tr');

		// генерируем заголовок таблицы
		for (let item of headers){
			let td = document.createElement('td');
			td.setAttribute('data-field', item.field);
			td.innerHTML = item.title;
			tr.appendChild(td);
		}

		thead.appendChild(tr);
		table.appendChild(thead);

		container.appendChild(table);
	}
	// переключение между страницами (т.е генерация таблицы на основе массива pages из localStorage)
	switchPage(){
		// если данных в localStorage по какой-то причине нет, то останавливаем работу метода.
		if (!localStorage.getItem('pages')) return;

		let table = document.querySelector(this.config.output.container + ' table'), // таблица
			pages = JSON.parse(localStorage.getItem('pages')), // массив со страницами
			tbody = document.querySelector(this.config.output.container + ' table tbody'); // элемент tbody в таблице

		// если tbody не найден, то создаем его. В обратном случае обнуляем.
		if (!tbody){
			tbody = document.createElement('tbody');
		}
		else {
			tbody.innerHTML = '';
		}

		// генерируем содержимое элемента tbody
		pages[this.currentPage - 1].forEach((row)=>{
			let tr	= document.createElement('tr');

			row.forEach((cell)=>{
				let td = document.createElement('td');
				td.innerHTML = cell;
				tr.appendChild(td);
			});

			tbody.appendChild(tr);
		});
		table.appendChild(tbody);
	}
	pagination(){
		// если данных в localStorage по какой-то причине нет, то останавливаем работу метода.
		if (!localStorage.getItem('pages')) return;

		let numPages 	= JSON.parse(localStorage.getItem('pages')).length, // кол-во страниц
			container 	= document.querySelector(this.config.output.container), // сюда помещаются все данные
			items 		= document.createElement('ul'); // контейнер пунктов меню

		// генерируем необходимое кол-во элементов.
		for (let i = 0; i < numPages; i++){
			let item = document.createElement('li');
			item.innerHTML = i+1;
			items.appendChild(item);
		}

		// вешаем обработчик клика на элементы пагинации
		items.addEventListener('click', (e)=>{
			if (e.target.tagName !== 'LI') return false;

			this.currentPage = +e.target.innerHTML; // обновляем текущую страницу
			this.switchPage(); // перерисовываем таблицу (tbody)
		});

		// добавляем пагинацию в контейнер
		container.appendChild(items);
	}
	init(){
		// запрос к серверу
		fetch(this.config.url)
		.then((response)=>{
			if (response.status !== 200){
				console.error('Something went wrong, response status: '+response.status);
				return;
			}
			response.json().then((response)=>{
				this.splitByPages(response); // разделяем данные по страницам
				this.switchPage(); // так как изначально this.currentPage = 1, то отрисовываем первую страницу
				this.pagination(); // генерируем пагинацию.
			});
		})
		.catch((err)=>{
			console.error(err);
		});
	}
}


Вызывается таким способом.
<div class="dataContainer data"></div>
<script>
	new Table({
		url: 'http://thethz.com/dataset.php?type=small',
		perPage: 50,
		output:{
			container: '.dataContainer'
		}
	});
</script>


Многое не сделано (активный пункт навигации, нормальная навигация по страницам, т.е, если много пунктов, то они все отображаются, но это не главное).

А вот так вот это дело работает:

http://jsfiddle.net/1sbLt00y/
Ответить с цитированием
  #2 (permalink)  
Старый 22.07.2015, 18:42
Аспирант
Посмотреть профиль Найти все сообщения от tysonfury2015
 
Регистрация: 22.07.2015
Сообщений: 68

Сообщение от Lemme
class Table{
Никто не осмелится критиковать. Все по науке сделано, а академики в отпуске.
Ответить с цитированием
  #3 (permalink)  
Старый 22.07.2015, 18:47
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Методы длинные, хороший метод - 3-4 строки, дробите мельче)
Ответить с цитированием
  #4 (permalink)  
Старый 22.07.2015, 18:56
Аватар для Lemme
Профессор
Отправить личное сообщение для Lemme Посмотреть профиль Найти все сообщения от Lemme
 
Регистрация: 15.07.2015
Сообщений: 511

Сообщение от tysonfury2015 Посмотреть сообщение
Никто не осмелится критиковать. Все по науке сделано, а академики в отпуске.
Какая разница как я его назвал, ведь дело не в этом.
Ответить с цитированием
  #5 (permalink)  
Старый 22.07.2015, 18:57
Аватар для Lemme
Профессор
Отправить личное сообщение для Lemme Посмотреть профиль Найти все сообщения от Lemme
 
Регистрация: 15.07.2015
Сообщений: 511

Сообщение от tsigel Посмотреть сообщение
Методы длинные, хороший метод - 3-4 строки, дробите мельче)
Длинные, но разбиты по смыслу
Ответить с цитированием
  #6 (permalink)  
Старый 22.07.2015, 18:59
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Почему вдруг splitByPages создает header таблицы? Название метода должно отображать его суть и содержимое не должно выходить за рамки.
У вас должны быть отдельные методы назначения обработчиков, снятия обработчиков. Методы отвечающие за создание дома хоршо бы тоже сделать отдельно.
Ответить с цитированием
  #7 (permalink)  
Старый 22.07.2015, 19:03
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Где jsDoc?
Ответить с цитированием
  #8 (permalink)  
Старый 22.07.2015, 19:06
Аспирант
Посмотреть профиль Найти все сообщения от tysonfury2015
 
Регистрация: 22.07.2015
Сообщений: 68

Сообщение от Lemme
Какая разница как я его назвал, ведь дело не в этом.
Да, дело не в этом. Дело в том, что ты нахерачил тут детсадовскую парашу, заправил ее ESXXX соусом, и вывалил сюда. С какой целью? Чтобы все удивились, какой ты крутой спец? Ну молодец, хуля, че тут еще сказать. Подожди, щас заваляться еще пара тройка нулевых пидорочков-хипстерочков, и вы будете сосать хвалить друг друга.
Ответить с цитированием
  #9 (permalink)  
Старый 22.07.2015, 19:11
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

я бы писал что-то типа такого (отрывок):

createPagination() {
     this.createPaginationDom();
     this.setPaginationHandlers();
  }

   setPage(index) {
      if (this.hasPage(index)) {
         this.currentPage = index;
         this.refrashBody();
      }
   }


switchPage - заменил бы на setPage и дать ей на вход номер страницы, тогда этот метод будет заодно служить публичным АПИ по переключению страницы из js
Ответить с цитированием
  #10 (permalink)  
Старый 22.07.2015, 19:19
Аватар для Lemme
Профессор
Отправить личное сообщение для Lemme Посмотреть профиль Найти все сообщения от Lemme
 
Регистрация: 15.07.2015
Сообщений: 511

tysonfury2015, нет, я хочу лишь показать то, что я хреновый, и спросить людей, как стать лучше, а ты, друг, можешь идти туда, откуда вылез, со своим трешом.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование ТАБЛИЦЫ с родителями в json объекты Patr56 Общие вопросы Javascript 5 28.07.2014 12:30
Не могу распарсить JSON. gorenie jQuery 3 29.11.2013 22:26
JSON - отобразить данные таблицы oracle / mssql / mysql ecivgamer Javascript под браузер 3 14.11.2012 18:17
json данные не грузятся в windows XP но грузятся в w7 rustamaha Элементы интерфейса 2 28.11.2011 12:35
JSON или JSONP для запросов на другой сервер? Метод GET, для длинных сообщений? Kotakota jQuery 5 23.08.2011 23:12