Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Задать background элементам генерируемым динамически (rivets.js) (https://javascript.ru/forum/events/56153-zadat-background-ehlementam-generiruemym-dinamicheski-rivets-js.html)

falkone 01.06.2015 20:03

Задать background элементам генерируемым динамически (rivets.js)
 
Динамически генерирую и вывожу контент из
categoryModel
по средствам MVC rivets.js

var gallery = document.getElementById('gallery');

var categoryModel = {
	col1: [
		{categoryName: 'Category 1', categoryImg: 'url', categoryStyle: true, categoryId: 'tt'},
		{categoryName: 'Category 2', categoryImg: 'url', categoryStyle: true, categoryId: 'dd'}
	],
	col2: [
		{categoryName: 'Category 3', categoryImg: 'url'},
		{categoryName: 'Category 4', categoryImg: 'url'},
		{categoryName: 'Category 5', categoryImg: 'url'}
	]
};


var setImg = function () {
	var a = categoryModel.col1;
	for (var i = 0; i < a.length; i++) {
		var b = a[i].categoryName;
		console.log(b);
	};

	var div = document.getElementById('test');
	var el = div.getElementsByTagName('*');
		for(var i=0; i<el.length; i++) {
			el[i].id = b;
		};
};

setImg();
rivets.bind(gallery, {'categoryModel': categoryModel});


Данной конструкцией
var setImg = function () {
	var a = categoryModel.col1;
	for (var i = 0; i < a.length; i++) {
		var b = a[i].categoryName;
		console.log(b);
	};

	var div = document.getElementById('test');
	var el = div.getElementsByTagName('*');
		for(var i=0; i<el.length; i++) {
			el[i].id = b;
		};
};

пытаюсь присвоить id для каждого сгенерированного элемента, но в результате задает всем элементам одинаковый id. как сделать что бы присваивало каждому элементу свой id, имя которого я беру из categoryName.

Таким образом, хочу присвоить каждому блоку свой background. Возможно есть более правильный и логичный способ чем данный?

falkone 01.06.2015 20:07

Если кому нужно в живую взглянуть, могу прикрепить исходник для наглядности.

falkone 01.06.2015 20:28

Все заработало, просто нужно было вынести саму функцию setImg за пределы области rivets, так как на тот момент элементы еще не построены и скрипт и не будет работать правильно!

рони 01.06.2015 20:36

falkone,
так и берите
el[i].id = a[i].categoryName;

зачем нужны строки 3 -6
Цитата:

Сообщение от falkone
Данной конструкцией

они же ничего полезного не делают.

falkone 01.06.2015 20:49

Цитата:

Сообщение от рони (Сообщение 373499)
falkone,
так и берите
el[i].id = a[i].categoryName;

зачем нужны строки 3 -6
они же ничего полезного не делают.

Так и есть, убрал их, в процессе неудачных попыток добавились они.

Финальный вариант выглядит вот так
var setImg = function () {
	var a = categoryModel.col1;
		var div = document.getElementById('test');
		var elems = div.getElementsByTagName('*');
		for(var i=0; i<elems.length; i++) {
			elems[i].id = a[i].categoryName;
		};

};
setImg();

falkone 01.06.2015 20:58

Переделал в более простую и правильную конструкцию

var setImg = function () {
	var a = categoryModel.col1;
		var div = document.getElementById('test');
		var elems = div.getElementsByTagName('*');
		for(var i=0; i<elems.length; i++) {
			elems[i].style.background = a[i].categoryImg;
		};
};
setImg();


Думаю в будущем можно сделать кастомный байндер для большего удобства вывода изображений.

kostyanet 01.06.2015 22:47

Как-то не вяжется пафос MVC на js и баян var elems = div.getElementsByTagName('*');

То есть все что в div'е? то есть div.children, в смысле текстовых нод от рендера в js и быть не может...

рони 01.06.2015 22:51

Цитата:

Сообщение от kostyanet
в смысле текстовых нод от рендера в js и быть не может

как связано это и это
Цитата:

Сообщение от kostyanet
getElementsByTagName

да в var elems текстовых нод быть не может

falkone 01.06.2015 23:03

Цитата:

Сообщение от kostyanet (Сообщение 373525)
Как-то не вяжется пафос MVC на js и баян var elems = div.getElementsByTagName('*');

Да согласен, пока это временное решение, с планами переделать под кастомный binders в rivets.js.


Цитата:

Сообщение от kostyanet (Сообщение 373525)
div.getElementsByTagName('*');

Здесь лежат дочерние div-и, которым уже и задаем background.


Часовой пояс GMT +3, время: 08:15.