상세 컨텐츠

본문 제목

budgety app 2편

JavaScript

by nata_developer 2020. 9. 15. 12:55

본문

var budgetController = (function () {
  var Expense = function(id, description, value) {
    this.id = id
    this.description = description
    this.value = value
  }

  var Income = function(id, description, value) {
    this.id = id
    this.description = description
    this.value = value
  }

  var data = {
    allItems: {
      exp: [],
      inc: []
    },
    totals: {
      exp: 0,
      inc: 0
    }
  }

  return {
    addItem: function(type, des, val) {
      var newItem

      if(data.allItems[type].length > 0) {
        ID = data.allItems[type][data.allItems[type].length -1].id + 1
      } else {
        ID = 0;
      }

      if(type === "exp") {
        newItem = new Expense(ID, des, val)
      } else if (type === "inc") {
        newItem = new Income(ID, des, val)
      }

      data.allItems[type].push(newItem)

      return newItem
    },

    testing: function() {
      console.log(data)
    }
  }
})();

var UIController = (function () {
  var DOMstrings = {
    inputType: ".add__type",
    inputDescription: ".add__description",
    inputValue: ".add__value",
    inputBtn: ".add__btn",
  };
  return {
    getInput: function () {
      return {
        type: document.querySelector(DOMstrings.inputType).value,
        description: document.querySelector(DOMstrings.inputDescription).value,
        value: document.querySelector(DOMstrings.inputValue).value,
      };
    },
    
    addListItem: function (obj, type) {
      var html, newHtml, element;

      if (type === "inc") {
        element = DOMstrings.incomeContainer;

        html =
          '<div class="item clearfix" id="inc-%id%"> <div class="item__description">%description%</div><div class="right clearfix"><div class="item__value">%value%</div><div class="item__delete"><button class="item__delete--btn"><i class="ion-ios-close-outline"></i></button></div></div></div>';
      } else if (type === "exp") {
        element = DOMstrings.expensesContainer;

        html =
          '<div class="item clearfix" id="exp-%id%"><div class="item__description">%description%</div><div class="right clearfix"><div class="item__value">%value%</div><div class="item__percentage">21%</div><div class="item__delete"><button class="item__delete--btn"><i class="ion-ios-close-outline"></i></button></div></div></div>';
      }

      newHtml = html.replace("%id%", obj.id);
      newHtml = newHtml.replace("%description%", obj.description);
      newHtml = newHtml.replace("%value%", obj.value);

      document.querySelector(element).insertAdjacentHTML("beforeend", newHtml);

    },

    getDOMstrings: function () {
      return DOMstrings;
    },
  };
})();

var controller = (function (budgetCtrl, UICtrl) {
  var setupEventListeners = function() {

    var DOM = UICtrl.getDOMstrings()

    document.querySelector(DOM.inputBtn).addEventListener("click", ctrlAddItem)

    document.addEventListener("keypress", function() {
        if(event.keyCode === 13 || event.which === 12) {
            ctrlAddItem()
        }
    })
}

var ctrlAddItem = function() {
    var input, newItem;

    input = UICtrl.getInput();

    newItem = budgetCtrl.addItem(input.type, input.description, input.value)
    
    UICtrl.addListItem(newItem, input.type)
}

return {
    init: function() {
        console.log("Application has started")
        setupEventListeners();
    }
}
})(budgetController, UIController);

controller.init()

budgetController 구성

 

1.Expenses, Income에 대한 생성자 생성

 

2.data 변수에 Expenses와 Income 인스턴스를 담을

 

allItems, totals 생성

 

3. addItem 메써드로  인스턴스를 생성하여 data에 저장

 

List에 item보여주기

 

1.type이 inc이면, income-# 에 관한 HTML을, exp면 expenses-#에 관한 HTML을 수정한다.

 

2.inserAdjacentHTML을 통하여 해당 element에 변경된 HTML을 적용한다.

 

*insertAdjacentHTML이란?

 

insertAdjacentHTML() 메서드는 HTML or XML 같은 특정 텍스트를 파싱하고,

 

특정 위치에 DOM tree 안에 원하는 node들을 추가 한다.

 

  이미 사용중인 element 는 다시 파싱하지 않는다.

 

그러므로 element 안에 존재하는 element를 건드리지 않는다. (innerHtml은 과 좀 다름).

 

innerHtml보다 작업이 덜 드므로 빠르다.

 

developer.mozilla.org/ko/docs/Web/API/Element/insertAdjacentHTML

 

Element.insertAdjacentHTML()

insertAdjacentHTML() 메서드는 HTML or XML 같은 특정 텍스트를 파싱하고, 특정 위치에 DOM tree 안에 원하는 node들을 추가 한다.  이미 사용중인 element 는 다시 파싱하지 않는다. 그러므로 element 안에 ��

developer.mozilla.org

 

'JavaScript' 카테고리의 다른 글

budgety app 4편  (0) 2020.09.15
budgety app 3편  (0) 2020.09.15
budgety app 1편  (0) 2020.09.15
자바스크립트 중간중간 모르는 것들!  (0) 2020.08.07
자바스크립트 비동기 프로그래밍 2편  (0) 2020.08.07

관련글 더보기