2012-09-13 2 views
1

내보기 중 하나 내부에이 일을 해요 :백본 - 이전에 이벤트가 바인딩되었는지 여부를 확인하는 방법은 무엇입니까?

문제가
render: function($options) { 
    ... 

    this.collection.on('reset', _(function() { 
     this.render($options); 
    }).bind(this)); 

    .... 
} 

, 재 렌더링이 트리거 된뿐만 아니라 때마다 reset 2 배, 4 배를 결과로 생성됩니다 바인딩 새로운 reset, 8 배속 등의 시간을 재 렌더링합니다.

바인딩을 초기화 섹션 (이 문제를 해결해야 함)로 이동하는 것은 약간 까다 롭습니다. 그러나 옵션이 아니기 때문에이 이벤트가 이전에 바인딩 된 경우 백본 확인을 수행하고, 또는 뭔가?

답변

2

를 호출 할 때마다 렌더링 기능을 바인딩 해제 당신이 할 수없는 좋은 이유가있다, 당신은 단지 깃발을 설정할 수 있습니다 :

initialize: function() { 
    var _this = this; 
    this._finish_initializing = _.once(function($options) { 
     _this.collection.on('reset', function() { 
      _this.render($options); 
     }); 
    }); 
    //... 
}, 
render: function($options) { 
    this._finish_initializing($options); 
    //... 
} 

플래그를 구현하는 데는 여러 가지 방법이 있습니다. _.once은 플래그 검사를 정교하게 숨 깁니다.

정말 같은 논리입니다
initialize: function() { 
    var finish_initializing = function($options) { 
     /* your binding goes here ... */ 
     this.off('render', finish_initializing); 
    }; 
    this.on('render', finish_initializing, this); 
}, 
render: function($options) { 
    this.trigger('render', $options); 
    //... 
} 

, 단지 다른 옷을 입고 : render 자체를 안 바인드 리스너가에 당신은 또한 이벤트를 트리거 할 수있다. 또한 명시적인 플래그와 renderif을 사용하거나 this._finish에 함수를 할당하고 initialize에 해당 함수가 delete this._finish이 될 수 있습니다.

+0

완벽하게 작동합니다. 많은 감사 = D – Kay

0

먼저, 그리고 명명 된 기능

var self = this; 
var onReset = function() { 
    self.render($options); 
} 

로 이벤트 핸들러 함수를 정의 수비에 이동하여 initialize에 바인딩 될 최고의하지만 가정

this.collection.off('reset', onReset); 
this.collection.on('reset', onReset); 
0

최근 자바 스크립트 변수를 사용하여이 작업을 수행했습니다. 어떤 기능

외부, 나는 선언 :

var boundalready =0 

그런 다음, 함수 내에서이 꽤 잘 나를 위해 일한

if (boundalready == 0){ 
     boundalready = 1; 
     bind(this); 
    }; 

.

1

이 이벤트가 이전에 바인딩되었는지 여부를 확인하는 데 백본 검사가 필요합니까?

물론 ..

!!this.collection._events["render"] 

백본은 유용하게하는 데 필요한 API의 대부분을 노출하지 않습니다. 어쨌든 사용하십시오.

관련 문제