2017-09-13 2 views
1

일단 VueJS가로드되면 내 viewmodel에 이벤트 리스너를 추가하려고합니다. VueJS를 사용하지 않는다면 이벤트 리스너를 추가하면 코드가 맞지만 VueJS에는 절대 연결되지 않는다는 것을 알 수 있습니다.VueJS 2에 이벤트 리스너 추가

 <div id="app"> 
      <div name="pageContent" id="preview"> 
          <section class="row"> 
           <div class="columns medium-12"> 
            <h1>This is the top content</h1> 
            <p>ashcbaubvdiuavduabd</p> 
           </div> 
          </section> 
          <section class="row"> 
           <div class="columns medium-6"> 
            <h1>This is left content</h1> 
            <p>ashcbaubvdiuavduabd</p> 
           </div> 
           <div class="columns medium-6"> 
            <h1>This is the right content</h1> 
            <p>ashcbaubvdiuavduabd</p> 
           </div> 
          </section> 
         </div> 
     </div> 
    <script type="text/javascript"> 
let editorContainer = document.getElementById('preview'); 
    let controls = document.getElementById('defaultControls'); 
    let cmsEditor = new CmsEditor(editorContainer, controls); 
      var app = new Vue({ 
       el: '#app', 
       data: { 
        editor: cmsEditor 
       }, 
       mounted: function() { 
        // wire up our listeners 
        console.log('mounted') 
        document.oncontextmenu = function() { return false; }; 
        let rows = this.editor.EditorContainer.getElementsByTagName("section"); 
        for (var i = 0; i < rows.length; i++) { 
         console.log("section " + i + " : " + rows[i].innerHTML); 
         rows[i].addEventListener('mouseover', function() { 
          console.log('mouse over event'); 
          this.editor.SetActiveRow(this); 
         }); 
         rows[i].addEventListener('dblclick', function() { 
          this.editor.DisplayContextMenu(this); 
         }); 
        } 
       }, 
       methods: { 
        save: function() { 
         console.log('save'); 
         this.editor.Save(); 
        }, 
        undo: function() { 
         console.log('undo'); 
         this.editor.Undo(); 
        } 
       } 
      }); 
    </script> 
+0

이벤트는 DOM 이벤트는 다른 :

는 나는 이런 식으로 뭔가해야한다고 생각합니다. Vue 이벤트를 등록하지 않았습니다. 잘못된 'this'에 액세스했기 때문에 콜백이 작동하지 않습니다. – thanksd

+1

가능한 [콜백 내부의 올바른 \'this \ '에 액세스하는 방법] (https://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-inside-a-callback) – thanksd

+0

ES6를 사용하는 경우 화살표 함수를 사용하여 어휘 'this'(즉, VueJS 인스턴스의 그것)가 바인딩됩니다. 그렇지 않으면 이벤트 리스너 외부로 캐시해야합니다 (예 : 'var self = this'를 사용하면 이벤트 리스너 내에서 Vue 인스턴스를 올바르게 참조 할 수 있습니다. 'self.editor.SetActiveRow (this)'. – Terry

답변

2

DOM에서 제거 할 요소에 대한 편집기를 만드는 것처럼 보입니다. Vue는 #app의 내용을 템플릿으로 사용하고 템플릿을 렌더링 함수로 컴파일 한 다음 DOM을 렌더링 함수의 결과로 바꿉니다. 편집기가 지금 사라진 DOM 요소에서 작성되었다는 것을 감안할 때, 코드가 실패 할 것으로 예상됩니다.

아마도 편집기 생성을 mounted으로 옮기고 이벤트 리스너를 설정하고 싶을 것입니다.

FWIW, 의견 작성자가 언급 한 this 문제가 있다고 생각됩니다. 뷰에서

mounted: function() { 
    let editorContainer = document.getElementById('preview'); 
    let controls = document.getElementById('defaultControls'); 
    this.editor = new CmsEditor(editorContainer, controls); 

    // wire up our listeners 
    console.log('mounted') 
    document.oncontextmenu = function() { return false; }; 
    let rows = this.editor.EditorContainer.getElementsByTagName("section"); 
    for (var i = 0; i < rows.length; i++) { 
    console.log("section " + i + " : " + rows[i].innerHTML); 
    rows[i].addEventListener('mouseover',() => { 
     console.log('mouse over event'); 
     this.editor.SetActiveRow(this); 
    }); 
    rows[i].addEventListener('dblclick',() => { 
     this.editor.DisplayContextMenu(this); 
    }); 
    } 
},