-
글쓴이글
-
2022년 1월 19일 11:25 #25133
AlgoRoot참가자안녕하세요. 강사님, 상품필터를 하는 과정에서 제가 여러 경우로 코드를 짰는데요.. 이중필터가 되지 않아서 질문드립니다. 이 외 질문이 꽤 있는데요.. 미리 질문많은점 죄송합니다. 제 자신이 너무 답답해요 아직 개념이 많이 부족한것같습니다..명쾌한 답변 부탁드릴게요ㅜ
**그리고 강의 정말 잘 듣고 있어요. 비전공자로서 이번달에 공부시작하면서 자바스크립트 문법공부하다가 스트레스 엄청받았는데 우연히 강사님 강의를 유투브로 보고 바로 강의시작했습니다. 강사님 덕분에 재미를 느낍니다. . 감사합니다.
코드는 맨 아래에 첨부하겠습니다. (코드를 복붙했는데 이상하게 보이네요.. 템플릿 에 넣을 때 사용한 백틱기호도 안보이고요 파일첨부가 안되서 어쩔 수 없이 그냥 올려요. 다른 방법있음 말씀주세요.)
깃헙에 소스 올렸습니다. https://github.com/AlgoRoots/JavaScript-Task-1/tree/main/applecoading-ask
--질문 1
제품가격필터를 하고 그 상태에서 '가격낮은 순' or 높은순 or A to Z or Z to A 를 눌렀을 때
가격필터 한 것 내에서 분류가 되야하는데 전체 상품개수에서 분류를 하는 오류가 납니다.
저와 같은 고민을 하고 계시는 분의 질문에 강사님의 남기신 댓글을 봤는데요.
( 1. 가격필터를 했을 경우 newProduct 이런 변수가 생길거같은데
newProduct가 있을 경우 그 변수로 sort하라고 코드를 짜는것이 어떨까요
아니면 2, 가격필터를 먹였는지 안먹였는지 여부를 어디다 저장해놓는 것도 좋겠군요 )
2번 방법은 어떻게 할지 모르겠어서, 1번 방법으로 이것저것 해봤는데 NEWProduct 가 정의되지 않았다고 뜨거나, 안됩니다. 제가 잘못 코드를 짠거겠죠..
아니면 NEWProduct 를 const라는 변수로 정의했는데 이게 가격필터를 했을 때는 지역변수안에서 정의한거라 당연히 안되는건가요?
오래고민하고 시도하다가 질문드립니다. 이쪽부분이 너무 이해가 약한것같아요..
본질적인 답을 받을 수 있을까요? 1번과 2번 방법 모두 어떻게 짜야하는지 궁금합니다.
--질문2
첫 번째 질문의 연장선이 될 수 있겠습니다.
// Price 에서 sort를 쓸 때 데이터바인딩과정을 해야한다고 했는데 그 과정을 .
for (let i = 0; i < 5; i++){
ProductTitle[i].innerHTML = products[i].title;
ProductSpan[i].textContent = ('Price: $ ' + products[i].price);
}이렇게 썼었다면, 제가 상품필터에 템플릿을 넣으면서 html에 product안에 들어갔던 것들을 주석처리했거든요. 그러면 저 함수가 안먹히는것아닌가요? 그래서 그런지 상품을 클릭하면
Uncaught TypeError: Cannot set properties of undefined (setting 'innerHTML')
이런 오류가 뜹니다. 어떤 코드로 대체해야하는건가요?
-- 질문 2 - 1
만약 상품의 개수가 많아졌을 때 forEach 를 써서 만들려면 어떻게 해야하나요?
products.forEach((i) => {
ProductTitle[i].innerHTML = products[i].title;
ProductSpan[i].textContent = ('Price: $ ' + products[i].price);
})이렇게 해봤는데 오류납니다ㅠㅠ
-- 질문3
또 템플릿을 각각 가격필터버튼에 넣었는데, 이렇게 되면 $20이하 , $20-$40, $40이상 세개의 버튼에 각각 템플릿을 넣어야하는데, 혹시 이 부분의 코드를 줄일 수 있는 방법이있나요? 이것 또한 함수밖에서 템플릿 변수를 정의하면 안되더라구요.
감사합니다.
2022년 1월 19일 14:40 #25156
codingapple키 마스터1 함수안에서만든 변수는 그 안에서만 사용가능하고 함수 밖에나가면 없다고 나옵니다
함수바깥에 만든 변수는 내부에서 자유롭게 사용가능합니다
2 ProductTitle[0]이 비어있다는 뜻인듯요
ProductTitle 변수 처음에 만들 때 없어서 그런가봅니다 반복문 안에서 셀렉터 새로 쓰면 됩니다
2-1은 무슨오류인가요 2번이랑 비슷할 것 같군요
3 긴 코드는 함수로 묶어두면 재사용가능합니다
템플릿 만들고 복붙하는 코드를 함수로 묶으면 될듯요
2022년 1월 19일 21:46 #25211
AlgoRoot참가자강사님 답변 감사드립니다. 한참보고 또 만져봤는데 정말 모르겠습니다.. 우선 답변달아주신것도 잘 이해가 가지않거나, 이해가 가는것은 해봤는데 안되서 다시 답변에 대해서 질문드립니다.
시간 써주셔서 감사합니다.
질문 1 답변에 대해서 :
함수 밖에서 정의한 변수는 안에서도 동작한다고 하신 말은 이해가 갑니다. 하지만,
NEWProducts 라는 새 변수를 각각의 가격필터를 하는 filter 함수 내에서 각각의 필터조건에 부합하는 NEWProducts라는 변수를 정의했는데 (함수내에서) 이렇게 각각 정의된 NEWProducts이기 때문에 함수 밖에서 정의할 수 없지 않나요?
하나로 예를 들면 아래와같이 NEWProducts 필터조건이 다르니까요..
$('#price_20to40').click(function(){
ProductsGroup.innerHTML = '';
const NEWProducts = products.filter(a => 20 < a.price && a.price< 40);
console.log(NEWProducts);
NEWProducts.forEach(function(a){
let template = `
<div class="products">
<img src="https://via.placeholder.com/600">
<div class="products-body">
<h5 class="product-title">${a.title}</h5>
<p> <span class="PDSpan">Price: $ ${a.price}</span> </p>
<button class="product-btn btn-danger">Order</button>
</div>
</div>
`;
ProductsGroup.insertAdjacentHTML("beforeend", template);
})
})
그래서
(1. 가격필터를 했을 경우 newProduct 이런 변수가 생길거같은데
newProduct가 있을 경우 그 변수로 sort하라고 코드를 짜는것이 어떨까요
아니면 2, 가격필터를 먹였는지 안먹였는지 여부를 어디다 저장해놓는 것도 좋겠군요 )
여기서 저는 1번으로 이중필터가 되게끔 하려고 했던건데, 필터함수에 각각있는 NEWProducts 라는 변수를 sort 를 이용해 오름차순,내림차순하는 함수에서는 어떻게 NEWProducts안에 있는 함수로 sort하라고 짤 수 있나요?
새로 NEWProducts를 sort안에서 또 정의해야하나요? 이게 맞다고해도 어떻게짜야될지 감이 안옵니다ㅠㅠ
그리고 2번도 어떻게 코드 짜는지 궁금한데 알 수 있을까요?
질문 2 답변에 대해서 :
2, 2-1이부분도 1번과 연관이 있을 것도 같아 다시 질문드려요.
제가 정의한 변수는
let ProductTitle = document.getElementsByClassName('product-title');
let ProductSpan = document.getElementsByClassName('PDSpan');
이랬구요. 하지만, html을 자바스크립트에 동적으로 생성하면서 html에 해당하는 부분은 다 주석처리를 했어요.
그래서 ProductTitle[0]라는게 없다고 나오는게 말씀처럼 맞는 것 같아요.
강사님께서 반복문 안에서 셀렉터를 새로 쓰시라고 하셨는데,
아래와 같이 했을 때 버튼을 누르면
“Uncaught TypeError: Cannot set properties of undefined (setting 'innerHTML')
at HTMLButtonElement.<anonymous> (sub.js:346:35)
(anonymous) @ sub.js:346”
라고 뜹니다. 그러면서 필터가 전체 항목 내에서 가격이 낮은 순으로 떠요..
필터로 걸러진 상품들 안에서 필터가 되야되는데 말이죠..
1번과 2번 질문 다 해결되면 이중필터가 잘될것 같은데 ㅜㅜ잘 모르겠습니다. 제가 쓴 반복문은 아래와 같아요.
// Price
sortByBtnPriceLow.addEventListener('click', function(){
products.sort(function(a,b){
return a.price - b.price
})
for (let i = 0; i < 5; i++){
// 반복문 안에서 셀렉터를 새로 쓴게 아래와 같은 것 아닌가요? 이러면 안되더라구요ㅜ 뭐가 문제일까요
// let ProductTitle = document.getElementsByClassName('product-title')[i];
// let ProductSpan = document.getElementsByClassName('PDSpan')[i];
ProductTitle[i].innerHTML = products[i].title;
ProductSpan[i].textContent = ('Price: $ ' + products[i].price);
}
})
질문 3 답변에 대해서 :
Template 함수를 만들어 넣었는데 적용이 안됩니다. 어떤부분을 수정해야할까요? 템플릿에 있는${a.title}와 ${a.price}이 지정되지 않아서(?) 그런거 같은데 그래서 어떻게 해야 되는지가 궁금합니다..
// function template
function template() {
`
<div class="products">
<img src="https://via.placeholder.com/600">
<div class="products-body">
<h5 class="product-title">${a.title}</h5>
<p> <span class="PDSpan">Price: $ ${a.price}</span> </p>
<button class="product-btn btn-danger">Order</button>
</div>
</div>
`;
}
const filterByBtnUpto20 = document.getElementsByClassName('filterby_price_under20')[0];
// less than 20 products - Javascripts
filterByBtnUpto20.addEventListener('click', function(){
ProductsGroup.innerHTML = '';
const NEWProducts = products.filter(function(a){
return a.price <= 20
})
NEWProducts.forEach(function(a){
ProductsGroup.insertAdjacentHTML("beforeend", template());
// $('#products-group').append(template());
})
})
2022년 1월 20일 10:28 #25249
codingapple키 마스터1 정렬하고 가격필터 둘다 먹이고 싶으면
정렬버튼누르면 밖에 있는 var newproduct에 정렬결과 저장하고
가격필터버튼누르면 밖에 있는 var newproduct 가져다가 또 가격필터하면 되겠군요
필터했는지 안했는지 여부는 필요없으면 굳이 생각안해도 됩니다
2 어레이 자료에 [i]를 두번이나 붙인듯요
3 함수안에 a라는 변수가 없어서 그렇습니다 파라미터로 입력할 수 있게 만들면 될듯요
-
글쓴이글
- 답변은 로그인 후 가능합니다.