0.0.2 β€’ Published 6 years ago

jquery-statebusking v0.0.2

Weekly downloads
2
License
MIT
Repository
github
Last release
6 years ago

jquery-statebusking

🎸Backbone alternative using jquery-statebus

npm

jquery-statebusking은 jquery-statebusλ₯Ό λ°±λ³Έ(backbone)처럼 λ§Œλ“­λ‹ˆλ‹€. μŠ€ν† μ–΄, λ·°λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. μ •μ˜λœ μŠ€ν† μ–΄, λ·°λŠ” λ°˜λ³΅ν•΄μ„œ μž¬μ‚¬μš© ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Why?

jquery-statebusλŠ” 뷰와 μƒνƒœλ₯Ό λΆ„λ¦¬ν•˜λŠ” μ•„μ£Ό κ°„λ‹¨ν•œ νŒ¨ν„΄μ„ μ œκ³΅ν•˜μ§€λ§Œ, λ°˜λ³΅λ˜λŠ” μƒνƒœ, λ·°λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ νŽΈμ˜λŠ” μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. jquery-statebuskingλŠ” 이 점을 λ³΄μ™„ν•©λ‹ˆλ‹€.

vs Backbone

  • No underscore - statebusking은 underscore에 λŒ€ν•œ μ˜μ‘΄μ„±μ΄ μ—†μŠ΅λ‹ˆλ‹€. (μ €λŠ” lodashλ₯Ό 더 μ’‹μ•„ν•©λ‹ˆλ‹€.)
  • View state - 백본의 λ·°λŠ” μƒνƒœκ΄€λ¦¬λ₯Ό λͺ¨λΈμ— μ „μ μœΌλ‘œ μ˜μ‘΄ν•˜μ§€λ§Œ jquery-statebusking은 λ‚΄λΆ€μƒνƒœλ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

Install

<script src="https://code.jquery.com/jquery.min.js"></script>
<script src="https://unpkg.com/jquery-statebus"></script>
<script src="https://unpkg.com/jquery-statebusking"></script>

Exmaple

<div id="counter">
  <span class="value"></span>
  <button class="increment"> + </button>
  <button class="decrement"> - </button>
</div>
var Counter = $.statebus.store('Counter', {
  state: {
    value: 1
  },

  action: {
    increment: function() {
      return {value: this.state.value + 1}
    },

    decrement: function() {
      return {value: this.state.value - 1}
    }
  }
})

var CounterView = $.statebus.view('CounterView', {
  events: {
    'click button.increment': 'onIncrementClick',
    'click button.decrement': 'onDecrementClick'
  },

  init: function(options) {
    var counter = this.counter = options.counter
    this.$value = this.$el.find('span.value')

    this.listenTo(counter, 'all', this.render, true)
  },

  render: function() {
    var value = this.counter.state.value
    this.$value.text(value)
  },

  onIncrementClick: function() {
    this.counter.action.increment()
  },

  onDecrementClick: function(){
    this.counter.action.decrement()
  }
})

new CounterView({ el: '#counter', counter: new Counter('app/counter') })

Store

μŠ€ν† μ–΄λŠ” 뷰와 λΆ„λ¦¬λ˜μ„œ μ•± μƒνƒœμ™€ λ‘œμ§μ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€. 백본의 μ½œλ ‰μ…˜, λͺ¨λΈκ³Ό λΉ„μŠ·ν•©λ‹ˆλ‹€.

Definition

μŠ€ν† μ–΄λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

var Counter = $.statebus.store('Counter', {
  state: {
    value: 1
  },

  action:{
    increment: function() {
      return {value: this.state.value + 1}
    },

    decrement: function() {
      return {value: this.state.value - 1}
    }
  },
})

μ•‘μ…˜ λ©”μ†Œλ“œμ˜ λ°˜ν™˜κ²°κ³Όκ°€ κΈ°μ‘΄ μƒνƒœμ™€ λ³‘ν•©λ˜μ–΄ μƒˆλ‘œμš΄ μƒνƒœλ₯Ό λ§Œλ“­λ‹ˆλ‹€.

Create

μ •μ˜ν•œ μŠ€ν† μ–΄λ₯Ό μƒμ„±ν•˜λŠ” 방법은 2κ°€μ§€μž…λ‹ˆλ‹€.

var counter = new Counter('app/counter')
// λ˜λŠ”
var counter = $.statebus.createStore('Counter', 'app/counter')

μŠ€ν† μ–΄ μƒμ„±μ‹œ, 이름이 ν•„μš”ν•©λ‹ˆλ‹€. 이름이 ν•„μš”ν•œ μ΄μœ λŠ” μ•„λž˜ Name Systemμ—μ„œ μ„€λͺ…ν•©λ‹ˆλ‹€.

Event

store.on() λ©”μ†Œλ“œλ‘œ μ•‘μ…˜ 이벀트λ₯Ό μ²­μ·¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

counter.on('increment', function (){ 
  console.log('incremented!!')
 })

counter.action.increment()
// => incremented!

"all" 이벀트둜 λͺ¨λ“  μ•‘μ…˜ 이벀트λ₯Ό μ²­μ·¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

counter.on('all', function (){ ... }) 

Method

state, actionμ™Έ λ‹€λ₯Έ λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•΄μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

$.statebus.store('Counter', {
  ...
  format: function(){
    return '총 ' + this.state.value + '회'
  }
})

...
var formatted = counter.format()
console.log(formatted)
// => 총 1회

Mixin

λ―ΉμŠ€μΈμ€ μ—¬λŸ¬ μŠ€ν† μ–΄ μ •μ˜λ₯Ό ν•˜λ‚˜λ‘œ ν•©μΉ©λ‹ˆλ‹€. λ―ΉμŠ€μΈμ„ ν™œμš©ν•˜λ©΄ 반볡적인 μŠ€ν† μ–΄ μ •μ˜λ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

var A = $.statebus.store('A', {
  state: {
    valueA: ''
  },

  action: {
    setA: function(a) {
      return {valueA: a}
    },
  }
})

// 2번째 인자둜 믹슀인 λŒ€μƒμ„ μ§€μ •ν•©λ‹ˆλ‹€.
var B = $.statebus.store('B', A, {
  state: {
    valueB: ''
  },

  action: {
    setB: function(b) {
      return {valueA: b}
    },
  },

  print: function() {
    console.log(this.state.valueA + '-' + this.state.valueB)
  }
})

var b = new B('app/b')
b.action.setA('foo')
b.action.setB('BAR')

b.print()
// => foo-BAR

λ°°μ—΄λ‘œ μ—¬λŸ¬ μŠ€ν† μ–΄ μ •μ˜λ₯Ό 믹슀인 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

$.statebus.store('A', [B, C, D], { ... })
// λ˜λŠ”
$.statebus.store('A', ['B', 'C', 'D'], { ... })

Initialize

store.init()을 μ •μ˜ν•˜λ©΄ μƒμ„±μ‹œ μ΄ˆκΈ°ν™” μž‘μ—…μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

var Store = $.statebus.store('Store', {
  state: {
    value: null
  },

  init: function(options) {
    this.state.value = options.value
  }
})

// μŠ€ν† μ–΄ μƒμ„±μ‹œ λ‘λ²ˆμ§Έ 인자둜 initν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό λ„˜κ²¨μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.
var store = new Store('app/store', { value: true }) 

μƒνƒœλ₯Ό λ™μ μœΌλ‘œ μ •μ˜ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

Name System

statebusking은 jqueryλ₯Ό μ‚¬μš©ν•œ λ ˆκ±°μ‹œ μ½”λ“œλ₯Ό κ°œμ„ ν•˜κΈ° μœ„ν•΄ λ§Œλ“€μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν™˜κ²½μ—μ„œλŠ” μ œλŒ€λ‘œ 된 λͺ¨λ“ˆμ‹œμŠ€ν…œμ„ κΈ°λŒ€ν•˜κΈ° μ–΄λ €μšΈ λ•Œκ°€ λ§ŽμŠ΅λ‹ˆλ‹€. μŠ€ν† μ–΄ μ •μ˜ν•˜κ±°λ‚˜ 생성할 λ•Œ 이름(name)을 μ§€μ •ν•˜μ—¬ μ˜μ‘΄μ„±μ„ ν•΄κ²°ν•˜λ©΄ λͺ¨λ“ˆμ‹œμŠ€ν…œμ΄ 없을 λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

$.statebus.store('Counter', { ... }) // μŠ€ν† μ–΄ μ •μ˜
$.statebus.store('A', ['B', 'C'], { ... }) // μŠ€ν† μ–΄ 믹슀인
$.statebus.createStore('Counter', 'app/counter') // μŠ€ν† μ–΄ 생성
$.statebus.remove('app/counter') // μŠ€ν† μ–΄ 제거

Remove

μŠ€ν† μ–΄λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.

new Model('app/model')
$.statebus.remove('app/model')

statebusking의 μŠ€ν† μ–΄(store)λŠ” μ •μ μž…λ‹ˆλ‹€.

백본의 λͺ¨λΈμ²˜λŸΌ λ™μ μœΌλ‘œ 제거λ₯Ό ν•  μˆ˜λ„ μžˆμ§€λ§Œ μΆ”μ²œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ˜λ„λ‘ μŠ€ν† μ–΄λ₯Ό 직접 μ œκ±°ν•˜λŠ” λŒ€μ‹ , 동적인 μƒνƒœλ₯Ό μ •μ˜ν•˜κ³  μ•‘μ…˜ λ©”μ†Œλ“œλ‘œ μƒνƒœ 값을 μ œκ±°ν•˜μ„Έμš”.

View

λ·°λŠ” μƒνƒœλ₯Ό λ‹΄λ‹Ήν•˜λŠ” μŠ€ν† μ–΄μ™€ λΆ„λ¦¬λ˜μ–΄ DOM λ³€ν™”λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.

Definition

λ·°λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

var CounterView = $.statebus.view('CounterView', { 
  init: function() { ... },
  ... 
})

μŠ€ν† μ–΄μ²˜λŸΌ view.init()을 μ •μ˜ν•˜λ©΄ μƒμ„±μ‹œ μ΄ˆκΈ°ν™” μž‘μ—…μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Create

μ •μ˜ν•œ λ·°λ₯Ό μƒμ„±ν•˜λŠ” 방법 μ—­μ‹œ 2κ°€μ§€μž…λ‹ˆλ‹€. λ·° μƒμ„±μ‹œ μ˜΅μ…˜κ°μ²΄λ₯Ό 인자둜 λ„˜κ²¨μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.

var view = new CounterView({el: '#counter'})
// λ˜λŠ”
var view = $.statebus.createView('CounterView', {el: '#counter'})

λ·°λŠ” jquery둜 λž˜ν•‘λœ DOM μ—˜λ¦¬λ¨ΌνŠΈμΈ view.$el을 κ°€μ§‘λ‹ˆλ‹€. μ˜΅μ…˜μ˜ el μ†μ„±μœΌλ‘œ DOM μ—˜λ¦¬λ¨ΌνŠΈλ₯Ό 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.

console.log(view.$el.get(0))
// => <div id="counter">...</div>

미리 μ„ μ–Έλ‹¨κ³„μ—μ„œ 지정할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

$.statebus.view('CounterView', {
  el: '#counter',
  ...
})

λ§Œμ•½ μ§€μ •ν•œ el이 μ—†λ‹€λ©΄ tagName의 μ—˜λ¦¬λ¨ΌνŠΈλ₯Ό λ§Œλ“­λ‹ˆλ‹€. 이 땐 직접 λ¬Έμ„œμ— μ‚½μž…ν•΄μ•Ό ν•©λ‹ˆλ‹€.

var view = new CounterView({tagName: 'div'})
view.$el.appendTo('body')

tagName의 기본값은 "div"μž…λ‹ˆλ‹€.

Mixin

λ·° μ—­μ‹œ μŠ€ν† μ–΄μ²˜λŸΌ 믹슀인이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

$.statebus.view('A', ['B', 'C'], { ... })

Event delegate

events μ†μ„±μœΌλ‘œ view.$elμ—μ„œ λ°œμƒν•˜λŠ” μ΄λ²€νŠΈμ™€ ν•Έλ“€λŸ¬ λ©”μ†Œλ“œλ₯Ό 맀핑할 수 μžˆμŠ΅λ‹ˆλ‹€.

$.statebus.view('View', {
  events: {
    // view.$elμ—μ„œ click μ΄λ²€νŠΈκ°€ λ°œμƒμ‹œ, onClick λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.
    'click': 'onClick',

    // νŠΉμ • μžμ‹μš”μ†Œμ—μ„œ λ°œμƒν•˜λŠ” 이벀트λ₯Ό 맀핑할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
    'click .child': 'onClick'
  },

  // jquery event 객체λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›μŠ΅λ‹ˆλ‹€.
  onClick: function(event) { ... } 
})

μ ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•΄ λ©”μ†Œλ“œλ₯Ό 맀핑할 수 μžˆμŠ΅λ‹ˆλ‹€. 이벀트 λ°œμƒμ‹œ λ°”λ‘œ μ•‘μ…˜ λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

$.statebus.view('CounterView', {
  events: {
    'click': 'counter.action.increment'
  },
  
  init: function(options) {
    this.counter = options.counter
  }
})

ν•Έλ“€λŸ¬λ©”μ†Œλ“œ thisλ₯Ό λ·° 객체둜 μžλ™λ°”μΈλ”©ν•©λ‹ˆλ‹€. λ”°λΌμ„œ λ©”μ†Œλ“œ thisκ°€ κ³ μ • λ˜μ§€ μ•Šμ€ 경우, μ˜λ„ν•˜μ§€ μ•Šμ€ λ™μž‘μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€ν–‰νžˆ μŠ€ν† μ–΄ μ•‘μ…˜ λ©”μ†Œλ“œλ“€μ€ this 바인딩이 미리 λ˜μ–΄ μžˆμ–΄ μ•ˆμ „ν•©λ‹ˆλ‹€.

Stateful

statebusking은 λ°±λ³Έκ³Ό 달리, λ·° μƒνƒœλž€ κ°œλ…μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€.

$.statebus.view('CounterView', {
  state: {
    value: 1
  },

  action: {
    increment: function() {
      return {value: this.state.value + 1}
    },
  },
  
  events: {
    'click button.increment': 'action.increment'
  }
})

이것은 μ•± μƒνƒœμ™€ λ·° μƒνƒœμ˜ 경계λ₯Ό λͺ…ν™•ν•˜κ²Œ ν•΄μ„œ μƒνƒœκ΄€λ¦¬μ— 도움을 μ€λ‹ˆλ‹€.

Options

λ·°λ₯Ό μƒμ„±μ‹œ, μ•„λž˜ μ˜΅μ…˜κ°μ²΄ 속성을 μ°Έμ‘°ν•©λ‹ˆλ‹€.

  • el - λ·° μ—˜λ¦¬λ¨ΌνŠΈ μš”μ†Œ(view.$el)λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.
  • events - DOM μ—˜λ¦¬λ¨ΌνŠΈ μ΄λ²€νŠΈμ™€ ν•Έλ“€λŸ¬ λ©”μ†Œλ“œλ₯Ό λ§€ν•‘ν•©λ‹ˆλ‹€.
  • attrs - DOM μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
  • tagName - el이 없을 경우, tagName μ†μ„±μ˜ μ—˜λ¦¬λ¨ΌνŠΈ λ§Œλ“­λ‹ˆλ‹€. 기본값은 "div"μž…λ‹ˆλ‹€.

μ˜΅μ…˜μ˜ 속성듀은 μ •μ˜λ‹¨κ³„μ—μ„œ 미리 μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.

view.listenTo(store, actionName, listener ,immediately)

μŠ€ν† μ–΄μ˜ μ•‘μ…˜ 이벀트λ₯Ό κ΅¬λ…ν•©λ‹ˆλ‹€.

  • store Store|string - λŒ€μƒ μŠ€ν† μ–΄. 이름(string)으둜 μŠ€ν† μ–΄λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • actionName string|string[] - ꡬ독할 μ•‘μ…˜μ΄λ²€νŠΈμž…λ‹ˆλ‹€.
  • listener (this:View, store, context) => void - μ•‘μ…˜μ΄ λ°œμƒν–ˆμ„ λ•Œ 싀행될 λ¦¬μŠ€λ„ˆ ν•¨μˆ˜μž…λ‹ˆλ‹€.
  • immediately boolean - μ¦‰μ‹œ μ‹€ν–‰μ—¬λΆ€μž…λ‹ˆλ‹€. 기본값은 falseμž…λ‹ˆλ‹€.
  ...,
  init: function(){
    this.listenTo(counter, 'increment decrement', this.render, true)
    // λ˜λŠ”
    this.listenTo('app/counter', 'increment decrement', this.render, true)
  },
  ...

view.listenTo()λŠ” ꡬ독을 μ·¨μ†Œν•  수 μžˆλŠ” ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. μ›ν•˜λŠ” μ‹œμ μ— 이벀트 ꡬ독을 μ·¨μ†Œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  ...,
  init: function() {
    this.unsubscribe = this.listenTo('app/counter', 'increment decrement', this.render)
  },

  onClick: function() {
    // μ•‘μ…˜ 이벀트 ꡬ독을 μ·¨μ†Œν•©λ‹ˆλ‹€.
    this.unsubscribe()
  },
  ...

view.on(actionName, listener ,immediately)

뷰의 μ•‘μ…˜ 이벀트λ₯Ό κ΅¬λ…ν•©λ‹ˆλ‹€.

  • actionName string|string[] - ꡬ독할 μ•‘μ…˜μ΄λ²€νŠΈμž…λ‹ˆλ‹€.
  • listener (view, context) => void - μ•‘μ…˜μ΄ λ°œμƒν–ˆμ„ λ•Œ 싀행될 λ¦¬μŠ€λ„ˆ ν•¨μˆ˜μž…λ‹ˆλ‹€.
  • immediately boolean - μ¦‰μ‹œ μ‹€ν–‰μ—¬λΆ€μž…λ‹ˆλ‹€. 기본값은 falseμž…λ‹ˆλ‹€.

view.listenTo()와 λ§ˆμ°¬κ°€μ§€λ‘œ ꡬ독을 μ·¨μ†Œν•  수 μžˆλŠ” ν•¨μˆ˜λ₯Ό λ°˜ν™˜λ°›μŠ΅λ‹ˆλ‹€

  ...,
  action: {
    increment: function() { ... },
  },

  init: function(){
    this.unsubscribe = this.on('increment decrement', $.proxy(this.render, this))
  },
  ...

단 view.listenTo()와 달리 view.on()은 λ·° μ™ΈλΆ€μ—μ„œ μ‚¬μš©ν•˜λŠ” 경우λ₯Ό κ³ λ €ν•΄μ„œ thisλ₯Ό μžλ™λ°”μΈλ“œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. $.proxy, λ˜λŠ” ES5 bind ν•¨μˆ˜λ‘œ thisλ₯Ό λ°”μΈλ“œν•˜μ„Έμš”.

view.$(selector)

λ·° μ—˜λ¦¬λ¨ΌνŠΈμ˜ μžμ‹μš”μ†Œλ₯Ό μ„ νƒν•©λ‹ˆλ‹€. view.$el.find()의 μΆ•μ•½ ν•¨μˆ˜μž…λ‹ˆλ‹€.

view.getState(store, key ,defaults)

μŠ€ν† μ–΄ μƒνƒœλ₯Ό μ–»μŠ΅λ‹ˆλ‹€.

  • store Store|string - λŒ€μƒ μŠ€ν† μ–΄. 이름(string)으둜 μŠ€ν† μ–΄λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • key string - 속성λͺ…. 점 ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•΄μ„œ κΉŠμ€(nested) 곳에 μœ„μΉ˜ν•œ 값을 κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • defaults undefined - 값이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ λ°˜ν™˜ν•  κΈ°λ³Έκ°’.
  ...,
  init: function() {
    this.articleTitle = this.getState('app/articles', 'articles.0.title')
  }

view.getPrevState(store, key ,default)

μŠ€ν† μ–΄μ˜ λ³€κ²½ μ§μ „μ˜ μƒνƒœλ₯Ό μ–»μŠ΅λ‹ˆλ‹€.

view.dispatch(actionName, ...args)

view.listenTo()둜 ꡬ독 쀑인 μŠ€ν† μ–΄μ— μ§€μ •ν•œ μ•‘μ…˜μ„ 일괄 μ‹€ν–‰ν•©λ‹ˆλ‹€.

$.statebus.store('Post', {
  ...
  action: {
    onPostWrite: function(post) {
      return {post: post}
    }
  }
})

$.statebus.view('PostView', {
  ...,
  init: function() {
    this.listenTo('app/post', 'all', this.render)
  }

  onSubmit: function(){
    var post = this.$textarea.val()
    this.dispatch('onPostWrite', post)
  },
  ...
})

μŠ€ν† μ–΄μ˜ μ•‘μ…˜μ„ λ¦¬μ•‘ν‹°λΈŒν•œ ν˜•νƒœλ‘œ λ””μžμΈ ν–ˆμ„ λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

view.dispatchAll(actionName, ...args)

μƒμ„±λœ λͺ¨λ“  μŠ€ν† μ–΄μ— μ§€μ •ν•œ μ•‘μ…˜μ„ 일괄 μ‹€ν–‰ν•©λ‹ˆλ‹€.

view.remove()

λ·° μ—˜λ¦¬λ¨ΌνŠΈλ₯Ό μ œκ±°ν•©λ‹ˆλ‹€. μŠ€ν† μ–΄μ— λŒ€ν•œ λͺ¨λ“  ꡬ독 μ—­μ‹œ μ·¨μ†Œν•©λ‹ˆλ‹€.

λ°±λ³Έκ³Ό 달리 μ‚­μ œ(remove)이벀트λ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

statebusking은 뷰제거λ₯Ό λΆ€λͺ¨μš”μ†Œκ°€ κ²°μ •ν•œλ‹€λž€ 원칙을 λ―ΏμŠ΅λ‹ˆλ‹€. 뷰와 뷰의 μ‚­μ œμ΄λ²€νŠΈκ°€ ν•„μš”ν•˜λ‹€λ©΄ λΆ€λͺ¨ 뷰의 μ•‘μ…˜λ©”μ†Œλ“œμ™€ μ•‘μ…˜μ΄λ²€νŠΈλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

Example Codes

License

MIT