• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem w JS-sie. Pętla nie wykonuje się prawidłowo.

Object Storage Arubacloud
0 głosów
157 wizyt
pytanie zadane 12 maja 2016 w JavaScript przez ShiroUmizake Nałogowiec (46,300 p.)

Pierw przedstawie działanie algorytmu. Mamy obiekt Raport, który przejmuje jedną właściwość-tablicę. Mamy drugi obiekt, który obecnie zawiera jedynie tablicę stringów. Wywoływana jest metoda przepisana do Raport - printRaport. W której następnie tworzony jest element HTML section.W section element nav i navigacja po fragmencie elementu HTML (jeszcze to nie działa), za pomocą innerHTML. Następnie węzeł jest dołączany do dokumentu, do ostatniego węzła wskazanego w obiekcie SalaryOption.nodeParent (w tym przypadku  document.body[0]) , następnie tworzy elementy tbody i zagniedżonym w nim table. Następnie tworzone są kolejne węzły td i tr oraz przepisane strngi za pomocą innerHTML. I tu następuje coś dziwnego. Pętla generuje tylko jeden węzeł, choć powinen 8. I tu ciekawe wskażnik tablicy this.raportArr zatrzymuje się na pierwszym elemencie lub na ostatnim . Za to wskażnik RaportOption.valueArr zatrzymuje się na ostatnim elemencie tablicy. Dlaczego tak się dzieje? A oto kod:

Klasa taxContract.

var TaxContract = function (salaryHourZl, salaryHourGr, dayHour, nightHour){
	ValidateMethods.call (this);
	SalaryMethods.call(this);
	this.dayHour = dayHour;
	this.nightHour = nightHour;
	this.salaryHourZl = salaryHourZl;
	this.salaryHourGr = salaryHourGr;
	}

Metoda sum, przepisana do klasy TaxContract, wykorzystająca metody dziedziczonej klasy w SalaryMethods oraz właściwości z obiektu SalaryOption.

TaxContract.prototype.Sum = function (){
	var thisMonth = new Date;
	var taxArr = new Array;
	var hours = this.dayHour + this.nightHour;
	taxArr.push(hours)
	var salary = this.salaryHourZl + (this.salaryHourGr/100);
	var state;
	var overHour;

		for (var i = 0 ; i > SalaryOption.stateArr.length; i++){ // Ta czesc jeszcze nie dziala.
			if (thisMonth.getMonth() == SalaryOption.stateArr[i])
				{
				state = SalaryOption.stateArr[i];
				break;
				}
			}
	if (hours > state){
		overHour = hours - state;
		taxArr.push(overHour);
		overHour.bruttoBonus = (salary * salaryOption.overBonus)/100;
		taxArr.push(overHour.bruttoBonus);
		overHour.bruttoSum = (salary + over.bruttoBonus) * overHour;
		this.dayHour = this.dayHour - overHour;
		var bruttoSum = (salary * this.dayHour) +  ((salary + ((salary * SalaryOption.nightBonus)/100)) * this.nightHour) + overHour.bruttoSum;
		taxArr.push(bruttoSum);
		
	}
	else{
		overHour = 0;
		overHour.bruttoBonus = 0;
		taxArr.push(overHour);
		taxArr.push(overHour.bruttoBonus);
		var bruttoSum = (salary * this.dayHour) +  ((salary + ((salary * SalaryOption.nightBonus)/100)) * this.nightHour);
		taxArr.push(bruttoSum);
	}
	
	var taxTotal = this.taxSocial(bruttoSum) + this.taxRent(bruttoSum) + this.taxSick(bruttoSum);
		taxTotal = parseFloat (taxTotal.toFixed(2));
		taxArr.push(taxTotal);
	var taxHealth =  this.taxHealth (bruttoSum , taxTotal);
		taxArr.push(taxHealth);
	var taxIncome = this.taxIncome (bruttoSum, taxTotal, taxHealth);
		taxArr.push(taxIncome);
	var nettoSum = bruttoSum - taxTotal - taxHealth - taxIncome;
		nettoSum = parseFloat(nettoSum.toFixed(2));
		taxArr.push(nettoSum);
		var createRaport = new Raport (taxArr);
			createRaport.raportPrint();
		
		
}

Klasa Raport.

var Raport = function (paramArr){
this.raportArr = paramArr;
/*this.allHours = paramArr[0].toString;
this.overHour = paramArr[1].toString;
this.overBonus = paramArr[2].toString;
this.bruttoSum = paramArr[3].toString;
this.taxTotal = paramArr[4].toString;
this.taxHealth = paramArr[5].toString;
this.taxSocial = paramArr[6].toString;*/
}

Metoda w klasie Raport.

Raport.prototype.raportPrint = function (){
	var c_section = document.createElement('section');
			c_section.setAttribute('id', 'taxRaport');
			c_section.classList.add ('taxRaport');
			c_section.innerHTML = "<nav class='raportMenu'><ul><ol><button class='raportButton'>Informacje Podstawowe</button></ol><ol><button class='raportButton'>Zawansowane Informacje</button></ol></ul></nav>";
			SalaryOption.NodeParent.appendChild(c_section);
	var c_tbody = document.createElement('tbody');
			c_tbody.setAttribute('id' , 'raportTbody');
			c_section.appendChild(c_tbody);
	var c_table = document.createElement('table');
			c_table.setAttribute('id' , 'raportTable');
			c_tbody.appendChild(c_table);
	var c_tr = document.createElement('tr');
	var c_tr1 = document.createElement('tr');
	var c_td = document.createElement('td');
			alert(this.raportArr.length); // Pokazuje 8.
			for (var i = 0; i < this.raportArr.length ; i++){ // Tu jest ten problem.
				c_table.appendChild(c_td);
				c_td.appendChild(c_tr);
				c_tr.innerHTML = this.raportArr[i]; // 973.44
				c_td.appendChild(c_tr1);
				c_tr1.innerHTML = RaportOption.valueArr[i]; // Kwota netto.
				
				// c_table.innerHTML = "<td> <tr>" + RaportOption.valueArr[2] + "</tr>" + "<tr>" + this.raportArr[2] + "</tr>" + "</td>";
				}
			
}

Obiekt:

var RaportOption = {
					valueArr: new Array (
					'Godzin łącznie: ',
					'Nadgodzin łącznie: ',
					'Stawka na nadgodzinach: ',
					'Wynagrodzenie Brutto: ',
					'Podstawowe Ubezpieczenia: ',
					'Ubezpiecznie zdrowotne:',
					'Ubezpiecznie społeczne: ',
					'Wynagrodzenie netto: '
					),
					}

Osobiście jestem ciekaw dlaczego tak się dzieje, Choć, po głębszej analizie jestem bardziej skłoniony w pójść w stronę bardziej modelu AJAX plus zmiana hierarchi klas. (Utworzenie jednej głównej taxJS klasa bez argumentowa, następnie taxJS utworzony kolejne klasy Raport,Error,AJAX,order,Contract). Co o tym myślicie?

1 odpowiedź

0 głosów
odpowiedź 12 maja 2016 przez Comandeer Guru (601,490 p.)
wybrane 12 maja 2016 przez ShiroUmizake
 
Najlepsza

Coś poknociłeś przy generowaniu tabeli – czemu wiersze (tr) wsadzasz w komórki (td)? Nie zdziwiłbym się, gdyby to przez to nie działało.

komentarz 12 maja 2016 przez ShiroUmizake Nałogowiec (46,300 p.)
Faktycznie :D.

Podobne pytania

–1 głos
2 odpowiedzi 293 wizyt
pytanie zadane 17 października 2017 w C i C++ przez Kuba Kawa Nowicjusz (140 p.)
+1 głos
2 odpowiedzi 216 wizyt
pytanie zadane 17 listopada 2015 w Python przez Devero Początkujący (300 p.)
0 głosów
2 odpowiedzi 323 wizyt
pytanie zadane 10 maja 2017 w JavaScript przez Krzysztofson Użytkownik (620 p.)

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...