2014-11-26 5 views
1

나는 백본과 조금씩 작업 해 왔고, 내가하고있는 일이 너무 지루하고 반복적 인 것으로 밝혀졌다.여러 모델을 가져 오는 백본

나는 여러 개의 백본보기를 가지며 각 뷰는 API 호출을 통해 데이터를 호출하는 모델을 갖습니다. 완료되면 결과를 렌더링하고 싶습니다. 쉬운만큼, 그러나 나는 다른 소스 (메시징 시스템)

//this corresponds to the view 
$.when(this.model.fetch(), this.msg.fetch()).done((result1, result2) => { 
    this.model.set('msg', this.msgtoJSON(), { silent: true }); 
    this.renderTemplate(template, this.model.toJSON()); 
}); 

이 작품에서 이러한 모델의 각 데이터에 연결해야하지만, 그것은 어디에서나 반복합니다. 나는 수십과 수십개의 견해를 가지고있다. 또한 템플릿을 새로 렌더링 할 수 있도록 주 이벤트 모델의 변경 이벤트에 대한 객체 리스너를 부착 할 수 없습니다.

아무도 내가 비동기 적으로이 메시징 종속성을 가져 와서 해당 모델을 가져올 때 백본 모델에 주입 할 수있는 방법에 대한 제안 사항이 있습니까?

답변

2

두 모델의 fetch을 병합하여 만들 수 있습니다. Backbone.Model.fetch의 기본 구현이 중단되지만 코드 반복을 방지하는 데 도움이됩니다. 비정규 화의 종류가 정상화됩니다.

var Slave = Backbone.Model.extend({ 
    urlRoot: 'first/api', 
    defaults: { 
     val1: '', 
     val2: '' 
    } 
}); 

var Master = Backbone.Model.extend({ 
    initialize: function(options) { 
     this.slave = options.slave; 
    }, 
    urlRoot: 'second/api', 
    fetch: function(options) { 
     var that = this, 
      masterPromise = this.constructor.__super__.fetch.call(this, options); 

     if (this.slave) { 
      return $.when(masterPromise, this.slave.fetch()).done(function(result1, result2){ //merged promise 
       that.set('msg', that.slave.toJSON(), { silent: true });     
      }); 
     } 
     return masterPromise; 
    } 
}); 

: 그리고

var slave = new Slave(), 
    master = new Master({ slave: slave }); 

master.fetch().done(function(){ 
    // render template here. 
}) 

이 구현은 슬레이브 모델을 사용하거나 사용하지 않고, 두 경우 모두를 위해 작동합니다.

은 몇 가지 당신이 좋아하는 템플릿을 렌더링하는 데 성공 콜백을 처리 설치 1.

을 참고 : 'msg'이 정의되지 않습니다이 경우

master.fetch({success: function() { // rendering here}}); 

를, 노예의 기다리지 않습니다 success의 원인 약속. success의 사용을 피해야합니다.

중 하나 2.If 모델의 이 실패 가져, 그리고 당신의 페치 모델 중 하나가 실패 때마다가 발광 병합 된 약속에 fail 콜백을 설정합니다. 각 모델의 실패 사례에 대해 개별적으로 직원을 수행해야하는 경우 약속을 병합하기 전에 모델의 패치에 해당 직원을 첨부해야합니다.

추신. 이 코드를 테스트하지 않았으므로 실패 할 경우 알려주십시오.

+0

의견에 감사드립니다. 나는 아마도 'this.listenTo (master, "change", renderTemplateCallback); ' 을 볼 수 없었을까요? 나는 주인의 성공이 변화를 일으킬 것이라고 생각한다. 슬레이브가 완료 될 때까지 마스터가 콜백을 변경하는 것을 방지 할 수 있는지 확실하지 않습니다. – chukoe

+0

할 수있을 것 같아. 뭔가 실패하면 앱에서 사용해보고 여기에 게시하십시오. –

관련 문제