2011-12-12 4 views
19

백본에서 기능을 비공개로 설정하여 모델 자체에만 노출되고 this에 액세스 할 수있는 방법이 있습니까?backbone.js 모델에 개인 기능을 추가하는 방법은 무엇입니까?

어떻게 updateTime을 비공개로 설정할 수 있습니까?

var Timeline = Backbone.Model.extend({ 
     url: 'servertime/', 

     start: function(){ 
      this.fetch({ 
       success: function(timeline, response){ 
        timeline.updateTime(); 
        setInterval(function() { 
         timeline.updateTime(); 
        }, 60 * 1000); 
       } 
      }); 
     }, 

     updateTime: function(){ //How can I make this private? 
      this.time = ... 
     } 
    }); 

답변

14

당신은 당신이 updateTime 개인 있는지 확인하고, 자기 호출하는 익명 함수에서 모든 것을 마무리하여이 방법을이를 수 있습니다

(function() { 
    var updateTime = function(){ // this stays private to this anonymous function 
    this.time = ... 
    }, 
    Timeline = Backbone.Model.extend({ 
    url: 'servertime/', 

    start: function(){ 
     this.fetch({ 
     success: function(timeline, response){ 
      updateTime.call(timeline); 
      setInterval(function() { 
      updateTime.call(timeline); 
      }, 60 * 1000); 
     } 
     }); 
    } 
    }); 

})(); 
+1

이 예는 'updateTime'이 타임 라인 메소드가 아니며 'this'가 잘못된 컨텍스트를 갖고 있기 때문에 잘못되었습니다. – masylum

+0

당신이 맞습니다. 나는 서두르다, 나는 지금 나의 예를 편집했다. – alessioalex

+0

'updateTime.call (timeline)'에주의를 기울여서 적절한 문맥이'updateTime'에 전달되도록하는 것이 중요합니다. –

7

당신은 updateTime 개인 기능을 할 수 전용 방법은입니다. 개인 기능을 명확히하기 위해 밑줄을 앞에 두는 것도 좋습니다.

(function() { 
    function _updateTime(timeline){ 
    timeline.time = ... 
    } 

    Timeline = Backbone.Model.extend({ 
    url: 'servertime/', 

    start: function(){ 
     this.fetch({ 
     success: function(timeline, response){ 
      _updateTime(timeline); 
      setInterval(function() { 
      _updateTime(timeline); 
      }, 60 * 1000); 
     } 
     }); 
    } 
    }); 

})(); 
+1

* function * vs * method *와 관련하여 특이성을 강조합니다. – pilau

+0

밑줄 *을 사용하면 아무 것도 표시되지 않으므로 * 사적인 기능임을 알 수 있습니다. 그러나 _private 또는 PRIVATE (예약어이므로 'private'가 아닌)라는 객체에 이러한 모든 함수를 그룹화하면 _private.updateTime() 또는 PRIVATE.updateTime()으로 호출 될 수 있습니다. –

+2

@GeorgeJempty : 나는 동의하지 않는다. 관례에 따라 메서드 앞에 밑줄을 붙이면 공개적으로 액세스 할 수있는 경우에도 비공개로 나타납니다. 나는 JS 디자인 패턴 책에서 이것을 읽었다. –

관련 문제