2013-05-03 2 views
2

백본 모델에서 중첩 된보기의 경우 initialize 함수에서 이벤트를 트리거 할 수 있습니까? 현재 코드를이 예제 (예 : https://stackoverflow.com/a/8523075/2345124)에 기반을두고 백본 1.0.0 용으로 업데이트했습니다. 여기 내 초기화 함수가 모델이다 : 나는 모델이 초기화되는 방법 renderMarquee 호출하기 위해 노력하고있어모델을 초기화 할 때 이벤트를 트리거 할 수 있습니까?

var Edit = Backbone.Model.extend({ 
    initialize: function() { 
     this.trigger('marquee:add'); 

     this.on('change', function(){ 
      this.trigger('marquee:add'); 
     }); 
    } 
    ... 
} 

:

var EditRow = Backbone.View.extend({ 
    initialize: function() { 
     this.listenTo(this.model, "change", this.render); // works 
     this.listenTo(this.model, "marquee:add", this.renderMarquee); // only called when changed, but not when initially created 
    ... 
} 

renderMarquee을 모델이 변경 될 때 호출이며, 초기화 될 때가 아닙니다. 'change'이벤트가 예상대로 작동합니다 (this.render가 호출 됨). 이견있는 사람?

감사합니다.

답변

0

view.listenTo 호출을 수행하기 전에 모델을 어딘가에 초기화하려고 했으므로 많은 의미가 없습니다. 불행히도, 당신은 정말로 그 문제에 대한 선택권이 없습니다.

아마도 이벤트를 이미 추가 한/제거 할 수있는 이벤트가 내장 된 Backbone.Collection으로 이동하려고 할 것입니다.

+0

오 - 당신이 말하는 것을 봅니다. 나는 그것이 단순한 것임을 알았습니다. 나는 'add'이벤트 콜렉션을 들으려고했지만 예기치 않은 행동으로 끝났다. 그 일이 어떻게 진행되고 있는지 더 자세히 살펴볼 것입니다 (컬렉션에 모델을 추가 할 때마다 컬렉션의 각 모델에 대해 '추가'이벤트가 호출 됨). – ururk

1

현재 비슷한 문제가 있습니다. 내 모델의 initialize 메서드에서 change 이벤트를 트리거해야했습니다. "아무것도 변경되었습니다"할 수있는 모델 상태를 설정 비워

var Model = Backbone.Model = function(attributes, options) { 
    ... 
    this.set(attrs, options); 
    this.changed = {}; 
    this.initialize.apply(this, arguments); 
    }; 

setinitializethis.change 전에 실행됩니다 나는 이런 일이되지 않는 이유를 밝혀 백본 코드로 보았다.

동작을 덮어 쓰려면 다음 코드를 내 initialize 메서드에 추가해야합니다.

initialize: function(attributes, options) { 
    ... 
    this.changed = attributes; 
    this.trigger('change'); 
    for (attr_name in attributes) { 
    this.trigger('change:' + attr_name); 
    } 
}, 

나는 상속 모델은 change 또는 change:attrxy에 바인딩 할 수 있기 때문에이 나를 ​​위해 중요하다, 수동 모든 변경 이벤트를 트리거합니다. 하지만 이것만으로는 충분하지 않습니다. 왜냐하면 방금 이벤트를 트리거하면 changedAttributes() 메서드가 false을 반환 할 것이므로 따라서 현재 속성에 this.changed을 설정하기 때문입니다.

관련 문제