React-dnd: λ‚΄λΆ€ 및 / λ˜λŠ” iframeκ³Ό ν•¨κ»˜ μ‚¬μš©ν•©λ‹ˆλ‹€.

에 λ§Œλ“  2015λ…„ 07μ›” 20일  Β·  22μ½”λ©˜νŠΈ  Β·  좜처: react-dnd/react-dnd

μ»¨ν…μŠ€νŠΈ, μ†ŒμŠ€ 및 λŒ€μƒμ΄ iframe λ‚΄λΆ€μ—μžˆλŠ” 경우 DnDκ°€ 이동 ν•΄μ œμ— μ‹€νŒ¨ν•©λ‹ˆλ‹€. DnD와 ν•¨κ»˜ μ œκ³΅λ˜λŠ” HTML5.js λ°±μ—”λ“œλ‘œ λ‹€μ‹œ μΆ”μ ν–ˆμŠ΅λ‹ˆλ‹€.
iframeμ—μ„œ rerender와 관련이 μžˆλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ. λ‹€μŒμ€ codepen에 λŒ€ν•œ μ˜ˆμž…λ‹ˆλ‹€. http://codepen.io/mattconde/pen/zGLXML?editors=101

enhancement wontfix

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ§Žμ€ μ‹œλ„ 끝에 λ‹€μŒκ³Ό 같이 iframe 내뢀에 μš”μ†Œλ₯Ό 놓을 μˆ˜μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
import FrameComponent from 'react-frame-component';

class DragDropAwareIFrame extends Component {
  static propTypes = {
    innerRef: PropTypes.func,
  };

  static contextTypes = {
    dragDropManager: PropTypes.object.isRequired,
  }

  constructor(props, context) {
    super(props, context);

    this.manager = this.context.dragDropManager;
  }

  componentDidMount() {
    const iframe = ReactDOM.findDOMNode(this.iframe);
    this.manager.getBackend().addEventListeners(iframe.contentWindow);
  }

  componentWillUnmount() {
    const iframe = ReactDOM.findDOMNode(this.iframe);
    this.manager.getBackend().removeEventListeners(iframe.contentWindow);
  }

  handleRef = (el) => {
    this.iframe = el;
    if (this.props.innerRef) this.props.innerRef(el);
  }

  render() {
    const { innerRef, ...props } = this.props;
    return <FrameComponent {...props} ref={this.handleRef} />;
  }
}
<DragDropContextProvider backend={HTML5Backend}>
    <div>
        <Item />
        <DragDropAwareIFrame>
            <div>
                <Dustbin />
            </div>
        </DragDropAwareIFrame>
    </div>
</DragDropContextProvider>

이것이 μ˜¬λ°”λ₯Έ 방법 인 것 κ°™μŠ΅λ‹ˆκΉŒ?

λͺ¨λ“  22 λŒ“κΈ€

μƒμž λ°–μ—μ„œ ν”„λ ˆμž„μ„ λ“œλž˜κ·Έ / λ“œλ‘­ν•˜λŠ” 것도 λ‚˜μ—κ²Œλ„ νš¨κ³Όκ°€ μ—†μ—ˆμŠ΅λ‹ˆλ‹€. λ“œλž˜κ·Έ / λ“œλ‘­ 이벀트λ₯Ό 각 μΆ”κ°€ ν”„λ ˆμž„μ˜ μ°½ κ°œμ²΄μ— μ μš©ν•˜λ©΄λ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. ν˜„μž¬ λ°˜μ‘ 앱을 싀행쀑인 μ°½ 개체 만 κ°€μ Έμ˜΅λ‹ˆλ‹€.

https://github.com/gaearon/react-dnd/blob/master/src/backends/HTML5.js#L130 -L139

졜근 ν”„λ‘œμ νŠΈμ—μ„œ HTML5 λ°±μ—”λ“œλ₯Ό μ›μˆ­μ΄ νŒ¨μΉ˜ν•˜μ—¬ μž‘λ™ν•˜λ„λ‘ν–ˆμŠ΅λ‹ˆλ‹€ ( setup 및 teardown λŒ€μ²΄ win μ°½ 개체 ν—ˆμš©).

https://gist.github.com/rasmusfl0e/39db428399bd196ef706

λ˜ν•œ ν•„μš”ν•  λ•Œ (ν”„λ ˆμž„ μ„€μ •μ‹œ) setup 및 teardown λ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ λ°±μ—”λ“œ μΈμŠ€ν„΄μŠ€κ°€ μ–΄λ–»κ²Œ λ“  λ…ΈμΆœλ˜μ–΄μ•Όν•©λ‹ˆλ‹€ ( DragDropContext.js μ—μ„œ 더 λ§Žμ€ monkey-patching ...). .

ν•˜μ§€λ§Œ 일단 μ™„λ£Œλ˜λ©΄ 맀λ ₯처럼 μž‘λ™ν•©λ‹ˆλ‹€ : D

였 μ™€μš° 쒋은 발견, λ§Žμ€ μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€. 였늘 λ‚˜μ€‘μ— μ‹œλ„ν•΄λ³Ό μ˜ˆμ •μΈλ° DragDropContext.js의 변경을 ν”Όν•  수 μžˆμŠ΅λ‹ˆκΉŒ? κ·Έλ ‡κ²Œν•˜λ©΄ λ¬Έμ„œμ—μ„œ μ–ΈκΈ‰ ν•œ κ²ƒμ²˜λŸΌ μƒˆλ‘œμš΄ λ°±μ—”λ“œλ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό ν•΄κ²°ν•˜λŠ” νŠΉμ • API 및 κ΅¬ν˜„ μ œμ•ˆμ„ κ³ λ €ν•˜κ²Œλ˜μ–΄ κΈ°μ©λ‹ˆλ‹€.
λΆˆν–‰νžˆλ„ μ •ν™•νžˆ 무엇이 λ°”λ€Œμ—ˆκ³  μ™œ λ°”λ€Œ μ—ˆλŠ”μ§€ μš”μ μ—μ„œ μ†Œν™”ν•˜κΈ°κ°€ μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

μ§€κΈˆμ€ iframe을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  κ°€μ • ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

@gaearon λ“œλž˜κ·Έ μ•€ λ“œλ‘­ νŽ˜μ΄μ§€ λΉŒλ”λ₯Ό κ΅¬μΆ•ν•˜λ €κ³ ν•©λ‹ˆλ‹€. λ‹€λ₯Έ λͺ¨λ“  것을 μ‹œλ„ν–ˆμ§€λ§Œ ν”ŒλŸ­μŠ€λ‘œ μž‘μ—…ν•˜λŠ” 것은 λ”μ°ν•©λ‹ˆλ‹€. 크둜슀 ν”„λ ˆμž„μ—μ„œ μž‘λ™ν•˜λ„λ‘ μ‘°μ •ν•΄μ•Ό ν•  λ‹¨μ„œλ₯Ό 쀄 수 μžˆμŠ΅λ‹ˆκΉŒ?

@nadimtuhin μ €λŠ” 문제λ₯Ό μ œκΈ°ν–ˆμ„ λ•Œ 크둜슀 ν”„λ ˆμž„ νŽ˜μ΄μ§€ λΉŒλ”λ₯Ό 직접 μž‘μ—…ν•˜κ³  μžˆμ—ˆμœΌλ©° 이번 주에 닀쀑 μ°½ μ†”λ£¨μ…˜μ„ λ‹€μ‹œ μ‹œμž‘ν•  κ²ƒμž…λ‹ˆλ‹€. React둜 iframe을 κ΄€λ¦¬ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?

λ‚˜μ—κ²ŒλŠ” iframe λ‚΄λΆ€μ—μ„œ μž‘μ—…ν•˜λŠ” 것이 더 이상 μ΅œμ„ μ˜ μ†”λ£¨μ…˜μΈμ§€ ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ ν™•μ‹€νžˆ 쒋을 κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ—¬λŸ¬ μ•±μ—μ„œ μž‘λ™ν•˜λ„λ‘ react-dndλ₯Ό λͺ©ν‘œλ‘œν•˜λŠ” 것이 더 λ‚˜μ€ μ˜΅μ…˜ 인 것 κ°™μŠ΅λ‹ˆλ‹€.

μ–΄μ œ κ°„λ‹¨νžˆ μ‚΄νŽ΄ λ³΄μ•˜κ³  html5 λ°±μ—”λ“œμ— 일뢀 핸듀을 λ‘œκΉ…ν–ˆμŠ΅λ‹ˆλ‹€. 첫 번째 μœˆλ„μš°μ˜ μ†ŒμŠ€λŠ” 두 번째 μœˆλ„μš°μ˜ νƒ€κ²Ÿμ—μ„œ κ°μ§€λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 그것은 λ‚΄κ°€ 얻은 ν•œμž…λ‹ˆλ‹€.

@gaearon λ‚΄ 첫 번째 μ‹€μ œ μ˜€ν”ˆ μ†ŒμŠ€

@mattconde no λ‚΄ λ°˜μ‘ μ•± λ‚΄μ—μ„œ iframe을 κ΄€λ¦¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 두 개의 λ‹€λ₯Έ ν”„λ ˆμž„μ— 두 개의 λ‹€λ₯Έ 앱을 μ‚¬μš©ν•  κ³„νšμž…λ‹ˆλ‹€. λΆ€λͺ¨ μ°½μ—λŠ” 데이터 μ‘°μž‘μ„μœ„ν•œ 논리와 ν”„λ ˆμ  ν…Œμ΄μ…˜μ„μœ„ν•œ μžμ‹ ν”„λ ˆμž„μ΄ μžˆμŠ΅λ‹ˆλ‹€. μžμ‹μ€ λΆ€λͺ¨ ν”ŒλŸ­μŠ€ μ €μž₯μ†Œμ—μ„œ μ†Œν’ˆμ„ κ°€μ Έμ˜΅λ‹ˆλ‹€.

λΏ‘λΏ‘

"HTML5 λ°±μ—”λ“œμ— 둜그λ₯Ό 넣은 λ‹€μŒ 쑰정을 μ‹œμž‘ν•˜μ‹­μ‹œμ˜€"외에 λ‹€λ₯Έ 지침을 μ œκ³΅ν•˜κΈ°κ°€ μ–΄λ ΅μŠ΅λ‹ˆλ‹€. κ°€λŠ₯ν•œ κ°€μž₯ κ°„λ‹¨ν•œ 예λ₯Ό λ“€μ–΄μ„œ μ œλŒ€λ‘œ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€. λ°±μ—”λ“œλŠ” μ°½ 이벀트 및 λ…Έλ“œ 이벀트λ₯Ό κ΅¬λ…ν•˜κ³ μ΄λ₯Ό μž‘μ—…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” ν•œ 가지 μž‘μ—… 만 μˆ˜ν–‰ν•©λ‹ˆλ‹€. iframe의 μž‘λ™ 방식에 λŒ€ν•΄ μΆ©λΆ„νžˆ λͺ¨λ¦…λ‹ˆλ‹€. 창을 κ΅¬λ…ν•˜μ§€ μ•Šκ³  νŠΉμ • λ…Έλ“œμ˜ μ΅œμƒμœ„ μ°½ (λ˜λŠ” iframe)을 κ΅¬λ…ν•˜λ„λ‘ μ½”λ“œλ₯Ό λ³€κ²½ν•΄μ•Ό ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” μ—¬κΈ°μ„œ λ‚΄ 깊이λ₯Ό λ²—μ–΄ λ‚¬μœΌλ―€λ‘œ μ“°λ ˆκΈ°μ— λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κ³  μžˆμ„μ§€λ„ λͺ¨λ₯Έλ‹€.

νŠΈμœ— λ‹΄μ•„ κ°€κΈ°

μ΅œκ·Όμ— 같은 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. μ‹€νŒ¨ν•˜λŠ” μ΄μœ λŠ” HTML5Backendκ°€ 창에 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό μ„€μ •ν•˜κΈ° λ•Œλ¬Έμ΄μ§€λ§Œ iframe λ‚΄μ—μ„œ μ‚¬μš©ν•˜λ €λ©΄ window.frames [0]κ³Ό 같이 μ„€μ •ν•΄μ•Όν•©λ‹ˆλ‹€.

@gaearon HTML5Backend.js의 μ„€μ • / 해체 κΈ°λŠ₯에 μ»¨ν…μŠ€νŠΈλ₯Ό μ „λ‹¬ν•˜λŠ” μ˜΅μ…˜μ— λŒ€ν•΄ μ–΄λ–»κ²Œ μƒκ°ν•˜μ‹­λ‹ˆκΉŒ?

iframe λ‚΄μ—μ„œ μž‘λ™ν•˜λŠ” ν–₯μƒλœ νŽΈμ§‘κΈ° (ν…μŠ€νŠΈ, 이미지, ..)λ₯Ό κ΅¬μΆ•ν•˜μ—¬ λ™μΌν•œ 문제λ₯Ό κ²ͺκ³  있으며 κ·Έ μ•ˆμ— μš”μ†Œ (ν…μŠ€νŠΈ, img)λ₯Ό λ“œλž˜κ·Έ μ•€ λ“œλ‘­ν•΄μ•Όν•©λ‹ˆλ‹€. 기본적으둜 μš”μ†Œλ₯Ό λ“œλž˜κ·Έ μ•€ λ“œλ‘­ν•˜μ—¬ μ£Όλ¬Έ.

https://github.com/gaearon/react-dnd/issues/435 문제λ₯Ό μ—΄μ—ˆκ³  iframe λ•Œλ¬Έμ΄λΌλŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” "μ‘°μ •"을 μ‹œλ„ ν•  κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ–΄λ–€ ν•΄κ²° 방법이 μžˆλ‹€λ©΄ 기뻐할 κ²ƒμž…λ‹ˆλ‹€! :)

iframeμ—μ„œ μž‘λ™ν•˜λ„λ‘ PR을 λ§Œλ“€λ €κ³ ν•©λ‹ˆλ‹€. ν˜„μž¬ 진행 μ€‘μ΄μ§€λ§Œ 아직 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. setup 및 teardown 을 각각 componentDidMount 및 componentWillUnmount μ—μ„œ ν˜ΈμΆœν•˜λŠ” 방법을 νŒŒμ•…ν•˜λŠ” 데 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€

https://github.com/gaearon/react-dnd-html5-backend/pull/27

@Vadorequest 우리 λ‘˜ λ‹€ μœ μ‚¬ν•œ μ΅œμ’… μ œν’ˆμ„ λͺ©ν‘œλ‘œν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” λΆ€λͺ¨μ—μ„œ μžμ‹ 창으둜 react-dnd 와 ν•¨κ»˜ μž‘λ™ν•˜λ„λ‘ 끝내지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€. μ œκ°€ ν•΄κ²° ν•œ ν•΄κ²° 방법은 에디터 (λΆ€λͺ¨) μ•±κ³Ό 미리보기 (μžμ‹) μ•±μ΄μ—ˆμŠ΅λ‹ˆλ‹€. 미리보기 앱은 νŽΈμ§‘κΈ° redux μŠ€ν† μ–΄μ— μ—°κ²°ν•  μˆ˜μžˆμ„ λ•ŒκΉŒμ§€ λ Œλ”λ§λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

그런 λ‹€μŒ redux μŠ€ν† μ–΄μ— μ‚¬μš©μžκ°€ νŽΈμ§‘κΈ°μ—μ„œ 멋진 μ½˜ν…μΈ  νŽ˜μ΄μ§€λ‘œ λ“œλž˜κ·Έ ν•  μˆ˜μžˆλŠ” ν…œν”Œλ¦Ώ λͺ©λ‘μ΄ μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‚΄ ν…œν”Œλ¦Ώ λͺ©λ‘μ€ νŽΈμ§‘κΈ° 창에 μžˆμ—ˆμ§€λ§Œ 미리보기둜 λ“œλž˜κ·Έν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

λ„€μ΄ν‹°λΈŒ μœ ν˜•μ„ μ§€μ›ν•˜λŠ” react-dnd 덕뢄에 에디터 μ°½μ—μ„œ ν…μŠ€νŠΈ λ“œλž˜κ·Έλ₯Ό μ„€μ •ν•˜μ—¬ λ Œλ”λ§ ν•  각 ν…œν”Œλ¦Ώμ— ν•„μš”ν•œ 정보λ₯Ό 전달할 μˆ˜μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ‚΄ μ½”λ“œ 슀 λ‹ˆνŽ« ...

    componentDidMount() {
        this.refs.template.addEventListener('dragstart', this.handleDragStart, false);
    },
    componentWillUnmount() {
        this.refs.template.removeEventListener('dragstart', this.handleDragStart, false);
    },
    handleDragStart(e) {
        const { template } = this.props;
        e.dataTransfer.setData('text/plain', JSON.stringify({
            type: template.type,
            name: template.name,
        }));
        return e;
    },

그런 λ‹€μŒ react-dnd λ‹€λ₯Έ μͺ½ λμ—μ„œ JSON λ¬Έμžμ—΄μ„ μž‘μ„ 수 있으며 정말 잘 μž‘λ™ν•©λ‹ˆλ‹€.

μ–΄λ–»κ²Œ νƒ€λŠ” 지 μ•Œλ €μ£Όμ„Έμš”. λ‹€λ₯Έ 방법에 λŒ€ν•΄ λ“£κ³  μ‹Άμ–΄μš”.

@mattconde λ‚˜λŠ” 두 개의 κ°œλ³„ λΆ„κΈ°, μΆ”μ•…ν•œ μˆ˜μ •κ³Ό 이에 λŒ€ν•œ μ‹€μ œ μˆ˜μ •μ—μ„œ μž‘μ—…ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μΆ”μ•…ν•œ μˆ˜μ •μ€ λ‹¨μˆœνžˆ HTML5Backend.js 파일의 ν•΄λ‹Ή 쀄을 λ³€κ²½ν•©λ‹ˆλ‹€. λ³€κ²½ 사항은 https://github.com/Gutenberg-Technology/react-dnd-html5-backend/commit/8b3d6a44b2cdbfe8d5bac025fc263715968d8b6cμ—μ„œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

_ (기본적으둜 target 맀개 λ³€μˆ˜λ₯Ό setup 및 teardown μΆ”κ°€ν•©λ‹ˆλ‹€.이 맀개 λ³€μˆ˜λŠ” λ‚΄ iframe을 κΈ°λ³Έκ°’μœΌλ‘œ μ‚¬μš©ν•˜κ³  window ν•©λ‹ˆλ‹€. iframe이 λ°œκ²¬λ˜μ§€ μ•ŠμœΌλ©΄ μ‹€μ œλ‘œ μ‹€νŒ¨ ν•  μ •λ„λ‘œ μΆ”μ•…ν•˜μ§€λ§Œ μ§€κΈˆμ€ ν•  κ²ƒμž…λ‹ˆλ‹€.) _

κ·ΈλŸ¬λ‚˜ iframe이 두 개 이상인 경우 일뢀 μƒν™©μ—μ„œλŠ” μ‹€νŒ¨ ν•  κ°€λŠ₯성이 μžˆμœΌλ―€λ‘œ λ§‰νžˆλŠ” 것을 ν”Όν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 더 λ‚˜μ€ 해결책은 target 맀개 λ³€μˆ˜λ₯Ό μ „λ‹¬ν•˜μ—¬ λ¦¬μŠ€λ„ˆλ₯Ό 바인딩 및 바인딩 ν•΄μ œν•˜μ—¬ λ‚΄ μ½”λ“œ λ‚΄μ—μ„œ setup 및 teardown λ₯Ό μˆ˜λ™μœΌλ‘œ ν˜ΈμΆœν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

해결책을 μ„€λͺ…ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. κ°€κΉŒμš΄ μž₯λž˜μ— 더 λ‚˜μ€ ν•΄κ²° 방법을 찾으면 PR을 ν™•μ‹€νžˆ κ°œμ„ ν•˜κ² μŠ΅λ‹ˆλ‹€. :)

μ•ˆλ…•ν•˜μ„Έμš”, 방금이 λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬ 창을 iframeκ³Ό μ—°κ²°ν•˜λŠ” 방법을 μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 창에 DragSourceλ₯Ό μΆ”κ°€ν•˜κ³  iframe에 DropTarget을 λ§Œλ“€κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. HTML5Backendλ₯Ό 쑰정해도 κ·Έλ ‡κ²Œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@mattconde κ³΅μœ ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. λ‚˜λŠ” λΉ„μŠ·ν•œ μ΅œμ’… μ œν’ˆμ„ λ§Œλ“€κ³  μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 더 λ‚˜μœ 것은 Angular 2λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λΆ€λΆ„μ μœΌλ‘œ React-dndλ₯Ό Angular둜 μ΄μ‹ν–ˆμ§€λ§Œ λ§ˆμ§€λ§‰μœΌλ‘œ iframe으둜 벽에 λΆ€λ”ͺ ν˜”μŠ΅λ‹ˆλ‹€. λ‹Ήμ‹ μ˜ 방법을 μ‹œλ„ ν•  κ²ƒμž…λ‹ˆλ‹€.

@gaearon μ—¬κΈ°μ˜ PR β˜οΈμ€ iframe을 μ§€μ›ν•˜κΈ° μœ„ν•΄ react-dndλ₯Ό ν—ˆμš©ν•©λ‹ˆλ‹€. 우렀 사항이 μžˆκ±°λ‚˜ 변경이 ν•„μš”ν•œ 경우 μ•Œλ €μ£Όμ‹­μ‹œμ˜€.

@kesne 당신은 μƒˆλ‘œμš΄ κ΄€λ¦¬μžμž…λ‹ˆκΉŒ? 이 PR을 κ²€ν†  ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

μ•ˆλ…•ν•˜μ„Έμš” @darthtrevino
λ³€κ²½ μ‚¬ν•­μœΌλ‘œ νŽ˜μ΄μ§€μ—μ„œ ν”„λ ˆμž„μœΌλ‘œ μš”μ†Œλ₯Ό λ“œλž˜κ·Έ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?
ν”„λ ˆμž„ μ•ˆνŒŽμœΌλ‘œ λ“œλž˜κ·Έ μ•€ λ“œλ‘­ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” @crysislinux , μ €λŠ”μ΄ 라이브러리λ₯Ό Angular 2둜 ν¬νŒ…ν•˜λ €κ³ ν•©λ‹ˆλ‹€. μ—¬λŸ¬λΆ„μ΄ 무엇을

예λ₯Ό λ“€μ–΄ iframe λ‚΄λΆ€μ˜ iframe μ™ΈλΆ€μ—μžˆλŠ” ν•­λͺ©μ„ λ“œλ‘­ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

<DragDropContextProvider backend={HTML5Backend}>
    <div>
        <Item />
        <Frame>
            <div>
                <Dustbin />
            </div>
        </Frame>
    </div>
</DragDropContextProvider>

λ§Žμ€ μ‹œλ„ 끝에 λ‹€μŒκ³Ό 같이 iframe 내뢀에 μš”μ†Œλ₯Ό 놓을 μˆ˜μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
import FrameComponent from 'react-frame-component';

class DragDropAwareIFrame extends Component {
  static propTypes = {
    innerRef: PropTypes.func,
  };

  static contextTypes = {
    dragDropManager: PropTypes.object.isRequired,
  }

  constructor(props, context) {
    super(props, context);

    this.manager = this.context.dragDropManager;
  }

  componentDidMount() {
    const iframe = ReactDOM.findDOMNode(this.iframe);
    this.manager.getBackend().addEventListeners(iframe.contentWindow);
  }

  componentWillUnmount() {
    const iframe = ReactDOM.findDOMNode(this.iframe);
    this.manager.getBackend().removeEventListeners(iframe.contentWindow);
  }

  handleRef = (el) => {
    this.iframe = el;
    if (this.props.innerRef) this.props.innerRef(el);
  }

  render() {
    const { innerRef, ...props } = this.props;
    return <FrameComponent {...props} ref={this.handleRef} />;
  }
}
<DragDropContextProvider backend={HTML5Backend}>
    <div>
        <Item />
        <DragDropAwareIFrame>
            <div>
                <Dustbin />
            </div>
        </DragDropAwareIFrame>
    </div>
</DragDropContextProvider>

이것이 μ˜¬λ°”λ₯Έ 방법 인 것 κ°™μŠ΅λ‹ˆκΉŒ?

@ethanve μ†μž„μˆ˜ λ¬Έμ œμ—μ„œμ΄ μŠ€λ ˆλ“œλ₯Ό μš°μ—°νžˆ λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. μ„€λͺ…ν•˜μ‹ λŒ€λ‘œ μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. https://cormacrelf.github.io/angular-skyhook/

λ˜ν•œ iframe λ‚΄μ—μ„œ dndλ₯Ό μ‚¬μš©ν•˜λŠ” 데 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€ (λΆ€λͺ¨ μƒν˜Έ μž‘μš© μ—†μŒ). λ“œλž˜κ·ΈλŠ” 잘 μž‘λ™ν•˜μ§€λ§Œ λ“œλ‘­ 쑴은 더 이상 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ“œλ‘­ 쑴이 iframe λ‚΄μ—μ„œ μž‘λ™ν•˜λ„λ‘ν•˜λŠ” μ†”λ£¨μ…˜μ€ λ¬΄μ—‡μž…λ‹ˆκΉŒ (ν•­λͺ©μ„ iframe λ‚΄μ—μ„œ μ™„μ „νžˆ 이동).

Touch λ°±μ—”λ“œμ—μ„œλŠ” μž‘λ™ν•˜μ§€λ§Œ HTML5 λ°±μ—”λ“œμ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 점을 μ§€μ ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰