2017-12-29 24 views
0

Vue가 생소하고 뷰 모델 데이터에 액세스하는 방법이 확실하지 않습니다. 언제 this.property을 사용해야하고 언제 vm.$data.property을 사용해야합니까?

아래 예제에서는 행을 선택할 수있는 테이블이 있고 모든 행을 선택하고 모든 행을 선택 취소하는 메서드가 있습니다. 선택을 취소하면 this.selectedRows에 의해 selectedRows에 액세스 할 수 있습니다. 그러나 select에서 this.selectedRows가 정의되지 않았기 때문에 rowTableVm.$data.selectedRow을 사용해야합니다.

언제 사용해야합니까? 언제 vm. $ 데이터를 사용해야합니까?

<tbody> 
    <tr v-for="row in get_rows()"> 
    <td> 
     <input type="checkbox" v-bind:value="row.id" v-model="selectedRows"> 
    </td> 
    <td></td> 
    <td></td> 
    <td></td> 
    <td></td> 
    <td></td> 
    <td></td> 
    <td></td> 
    <td></td> 
    </tr> 
</tbody> 

var rowTableVm = new Vue({ 
     el: '#rowTable', 
     data: { 
      rowList: [{..},{..}], 
      selectedRows: [] 
     }, 
     methods: { 
      get_rows: function get_rows() { 
       return this.rowList; 
      }, 
      deselect_rows: function() { 
       this.selectedRows= []; 
      }, 
      select_rowse: function() { 
       this.deselect_rows(); 
       this.get_rows().forEach(function (entry) { 
        rowTableVm.$data.selectedRows.push(entry.id); 
       }); 
      } 
     } 
    }); 

답변

1

문제가 발생한 이유는 범위 지정 때문입니다. 특히 forEach 안에있는 this은 더 이상 Vue 인스턴스에 바인딩되지 않습니다. 이 문제를 해결하기 위해, 다음과 같이 루프를 입력하기 전에 변수에 대한 참조를 저장하려고 :

일반적으로
select_rowse: function() { 
    this.deselect_rows(); 
    var this_vue_instance = this; 
    this.get_rows().forEach(function (entry) { 
     this_vue_instance.selectedRows.push(entry.id); 
    }); 
} 

, 당신은 가능한 vm.$data를 사용하여 피하려고한다. 특히 코드 전체에 분산 된 변수에 대한 참조가 여러 개 있고 변수의 이름을 변경해야하는 경우 this이 일관성있게 유지되는 경우 문제가 발생합니다. 변수 참조가 절대적으로 필요한 경우에만 사용하십시오. 이는 드문 경우 여야합니다.

+0

Vernj와는 아무런 관련이 없습니다. 'forEach'(및 다른 많은 장소)에서 'this'가 작동하는 것과 같습니다. Javascript 자체에있어 근본적인 것입니다. –

+0

언제나 vm. $ data를 참조하는 것이 더 나은가요? 대부분 forEach 블록을 많이 사용하게 될 것입니다. –

+0

@LordVermillion 내가 말했듯이, 가능하면 언제나'vm. $ data'를 사용하지 말아야합니다. 대신에 'this'에 대한 변수 참조를 사용하는 것에 충실하십시오. 양자 택일로,'Array.forEach'는'forEach (callback, thisArg)'와 같은 메소드 시그니처를가집니다.'thisArg'는'this' 참조를 명시 적으로 사용하도록 허용합니다. 따라서 this.get_rows(). forEach (function (entry) {..., this)};를 할 수 있으며'forEach' 호출에서'this'가 참조하는 것을 리바 인 딩해야합니다. 그러나 절대적으로'VM $ data'를 사용하는 것을 피하는 것은 아주 나쁜 습관입니다! –