0

나는 fectch()를 사용하지 않고 이미 사용할 수있는 JSON 데이터를 사용하여 컬렉션을 만들고 있습니다.BackboneJS catch 이벤트 초기로드에서 OnAdd

this.displays = new Displays(jQuery.parseJSON($('#temp_json').html())); 

나는 컬렉션이 컬렉션에서이 모델의 위치에 있어야 할 '위치'값 설정을 가지고하는 것이 각각의 모델이 필요합니다.

내가하려는 것은 초기로드시 각 모델이 JSON에서 생성되고 컬렉션에 추가되는 이벤트를 잡는 것입니다. 불행하게도 나는 나의 수집을 결합해야하는 이벤트를 찾을 수 없습니다

theModel.set('position', this.length); 

:

나는 다음과 같은 일을 할 수 있습니다. 또한이 컬렉션의 모델에는 동일한 작업을 수행해야하는 다른 컬렉션 (...)이 포함되어 있습니다.

이 힘이 이상한 것 같다하지만 난 내가 좋아하는 일을 peform받는 것입니다 내보기로 나중에이 작업을 수행해야한다 :이 충분히 분명하다

var prototypeNames = [this.model.get('display').get('position'), this.model.get('position')]; 

희망. 감사합니다.

답변

0

솔루션 :

나는 실제 모델 관계로 작업 할 때 굉장하다, backboneRelational을 사용했다. 컬렉션을 만들 때 컬렉션의 각 항목에 대해 트리거되는 "relational : add"를 듣고 있습니다.

그런 다음 내 항목에 일부 값을 설정하고 내보기에서들을 수있는 새 이벤트 'postAdd'를 트리거합니다.

window.Displays = Backbone.Collection.extend({ 
    model: Display, 
    initialize: function(data, options){ 
     this.on("relational:add", function(relModel){ 
      relModel.set('pos',this.indexOf(relModel)); 
      this.trigger('postAdd', relModel); 
     }, this); 
    }, 

}); 
1

Collection.add -function은 add -event를 발생시키고 on -function으로들을 수 있습니다. 이벤트는 추가 된 모델과 매개 변수로 유용한 속성 (모델이 추가 된 색인과 같은)을 포함하는 옵션 객체를 전달합니다. (documentation here)

그래서 당신은 이런 식으로 뭔가를 할 수 있습니다 :

collection.on('add', function(model, options) { 
    model.set('position', options.index); 
}); 

기존 문서에서 부족한 있기 때문에, 그냥 로그는 add -event가 전달하는 매개 변수에 대한 자세한 내용을 찾으려면 베스트.

collection.on('add', function(model, options) { 
    console.log(options); 
}); 

희망이 있습니다. 나를 위해 일한

+0

내가이 항목을 여러 항목으로 포함하는 경우 컬렉션을 구성 할 때이 이벤트가 트리거되지 않습니다. 그래서 onLoad는 내가 필요로하는 것이기 때문에 트리거되지 않습니다. – LEM01

0

컬렉션의 기본 '추가'구현을 재정의하여 백본에 의해 묵음 처리되지 않는 맞춤 이벤트를 트리거 할 수 있습니다.

var MyCollection = Backbone.Collection.extend({ 

    // Override the default 'add' implementation... 
    add: function(models, options) { 

    // Call the default implementation first... 
    Backbone.Collection.prototype.add.apply(this, arguments); 

    // Fire our custom events on the models... 
    while (model = models.shift()) { 
     model.trigger('customAdd', model, this, options); 
    } 

    return this; 
    } 

}); 

이제 모델에서 트리거 된 'customAdd'이벤트를들을 수 있습니다. silent = true 일 때이 이벤트가 항상 트리거됩니다.

결과적으로 항목에 {silent : false}가 추가되면 'add'와 'customAdd'의 두 이벤트가 트리거됩니다.

저는이 기법을 사용하여 새 컬렉션이 처음로드되고 모든 모델이 생성 될 때 이벤트를 시작했습니다. 모델이 생성되기 전에 initialize 메서드가 호출되기 때문에 모델을 만들 때 코드를 실행하도록 'reset'함수를 재정의해야했습니다.