2013-05-20 2 views
1

매번 인스턴스화되는 동일한 백본보기의 여러 인스턴스에 대한 많은 게시물을 읽었으며 더 이상 사용하지 않아도 DOM에서보기가 멈 춥니 다. 방법과 같이, 뷰 내에서 선언 된 변수를 제거하는 this.remove()백본보기 내에서 선언 된 변수를 제거 할 수 없습니다.

this.unbind()하지만를 사용하여이 문제를 해결하는 방법 :

var myview = Backbone.View.extend({ 
    el : '#somediv', 
    var1 : '', 
    var2 : '', 
    array1 : [], 

    initialize : function() { //init code here 
    }, 

    render : function() { //rendering code here 
    } 
}); 

그래서 내 질문입니다, 내가 거기 선언이 변수의 인스턴스를 제거 할 방법 : var1, var2, array1. 버튼을 클릭 할 때마다이보기를 호출해야합니다. 그리고 매번이 변수의 이전 값을 볼 수 있습니다. this.remove()this.unbind()은 DOM에서보기를 제거하고 이벤트 바인딩의 삭제를 취소 할 수 있습니다.

답변

4

Backbone.View.extend 호출 내에서 정의한 속성은 프로토 타입에 첨부되어 있으므로보기의 모든 인스턴스에서 공유됩니다. 즉, 인스턴스 속성이 아닌 클래스 속성과 비슷합니다. var1var2은 인스턴스 당 새 값을 할당하기 때문에 괜찮습니다. array1 배열 및 이와 유사한 속성은 문제가 될 수 있습니다. 이 작업을 수행한다고 가정 새로운 인스턴스를 생성

var v = new myview; 
v.array1.push('pancakes'); 

그래서 v.array1이 프로토 타입의 배열을 참조 할 프로토 타입에서 모든 것을 깊은 복사하지 않습니다. 즉, 다음 new myview은 이미 'pancakes'입니다.

일반적인 해결책은 생성자에서 인스턴스 속성을 초기화하는 것입니다. 백본의 경우, 생성자는 initialize입니다 : 그 고유 한 DOM 요소를 식별하는대로 당신은 또한 당신의 el: '#somediv' 문제로 실행할 수 있습니다

var myview = Backbone.View.extend({ 
    el: '#somediv', 
    initialize: function() { 
     this.var1 = ''; 
     this.var2 = ''; 
     this.array1 = [ ]; 
    }, 
    //... 
}); 

. 당신이 그 요소를 제거하고 다시 만들고있는 한, 당신은 괜찮을 것입니다; 나는 뷰를 만들고 자신의 el을 파괴하도록 권하고 싶습니다. 그러나 좀비와 누수가 줄어들면 그렇게합니다.

+0

Perfect! 배열에 항상 이전 요소가 있음을 잊어 버렸습니다. 너는 그 말을했다! –

+0

그래서 새로운 뷰를 생성하기 전에 뷰의 이전 인스턴스를 제거하고 싶다면 뷰에서'this.remove()'와'this.unbind()'를 호출하는 것만으로 충분합니까? I가 사용하고 는 JS 라이브러리 필요하므로 I는 다음처럼 뷰 인스턴스화 : '요구 ([ '뷰/someview', 함수 (view_object) { VAR의 my_view = 새로운 view_object(); })' –

+0

@ RahulDole : 또는'on'을'listenTo's로 바꾸면 표준'remove'만으로 충분합니다. –

관련 문제