2011-09-28 6 views
0

모델의 매시업을 글로벌 json 개체로 보내는 레일 컨트롤러가 있습니다. 내 클라이언트 측에이레일에서 모델 매시업으로 백본 동기화

{ 
    dogs : { species: {}, ...}, 
    cats : { food: {}, ...}, 
    foxes : { }, 
    ..., 
    ... 
} 

같은 뭔가, 나는 모든 이들 엔티티 깔끔하게 다른 백본 모델과 백본 컬렉션으로 밖으로 분리했다.

일부 onchange 이벤트에서 일부 모델 속성의 매쉬업을 HTTP POST 요청으로 서버에 보내야하고 서버가 몇 가지 모델에 걸쳐 값을 다시 보내는 응답을 보내야합니다.

그런 ajax 시나리오를 처리하기 위해 Backbone.sync를 어떻게 설정합니까? 나는 레일즈 백엔드를 상당히 안정적으로 구현하기 때문에이를 바꾸고 싶지 않다. 아니면 내 백본보기 중 하나에서 jQuery를 통해 바닐라 $ .ajax 요청을 만들고 아약스 성공/실패 콜백에서 처리합니까?

답변

2

나는 백본을 통해이를 수행하는 몇 가지 방법이 있다고 생각합니다. 그런 다음

var my_mash = new MashupModel({ 
    dog: dogModel.toJSON(), 
    cat: catModel.toJSON(), 
    foxes: foxCollection.toJSON() 
}); 
// do stuff if you need... 

:

var MashupModel = Backbone.Model.extend({ 
}); 

그런 다음 당신은 당신이 평소처럼 어떤 모델을 전달 (또는 그 문제에 대한 모음) 할 수 있습니다 나는 매시업을 대표하는 모델로 시작 거라고 생각 응답이 올 때 당신이 원하는 일을 다시 정상 같은 :

my_mash.save({}, { 
    success: function(model, response) { 
    // do stuff here to put new data into the proper models/collections 
    }, 
    error: function() { alert("I FAIL!"); } 
}); 

잘하고 있다는 좋은 ... 그러나, 나는 르 MashupModel 개체로 대신의 요청에 따라 아래 위를 밀어 더 좋을 것 같아 벨. (백본가 아약스에 대한 준비 바인드합니다 얻기 위해 호출 이후)

var MashupModel = Backbone.Model.extend({ 
    initialize: function(attrs) { 
    // can't remember the actual code, but something along the lines of: 
    _.each(attrs.keys, function(key) { 
     this.set(key, attrs.key.toJSON(); 
    }); 
    }, 

    save: function(attrs, opts) { 
    var callback = opts.success; 
    opts.success = function(model, response) { 
     // do your conversion from json data to models/collections 
     callback(model, response); 
    }; 
    // now call 'super' 
    // (ala: http://documentcloud.github.com/backbone/#Model-extend) 
    Backbone.Model.prototype.set.call(this, attrs, opts); 
    } 
}); 

아니면 toJSON을 무시할 수 : 다시, 여러 가지 방법으로 지금

// class definition like above, no initilize... 
... 
toJSON: function() { 
    // again, this is pseudocode-y 
    var attrs = {}; 
    _.each(this.attributes.keys, function() { 
    attrs.key = this.attributes.key.toJSON(); 
    }); 
    return attrs; 
} 
... 
// save: would be the same as above, cept you'd be updating the models 
// directly through this.get('dogs').whatever... 

을, 당신은 다만 할 수 있습니다

var my_mash = new MashupModel({ 
    dog: dogModel, 
    cat: catModel, 
    foxes: foxCollection 
}); 
// do some stuff... 

my_mash.save({}, { 
    success: function(model, response) { 
    // now only do stuff specific to this save action, like update some views... 
    }, 
    error: function() { alert("I FAIL!"); } 
+0

매우 흥미 롭습니다. MashupModel과 같은 추상화 된 백본 모델을 만들려고했지만 그 전에 커뮤니티를 조사했습니다. 실험을 어떻게 진행했는지에 대해보고하고 아마 그 답을 받아 들일 것이라고 생각합니다. 다시 한 번 감사드립니다! – papdel

0

이 작업은 가능하지만 backbone.sync를 수정하기가 어려울 수 있습니다. 나는 평범한 오래된 jquery $ .ajax 요청으로가는 것이 좋습니다. 그런 다음 성공하면 정보를 분리하고 컬렉션을 채 웁니다.

$.get("/whatever", function(data){ 
    catCollection.reset(data.cats); 
    dogCollection.reset(data.dogs); 
    // etc 
}); 


data = {}; 
data.cats = catCollection.toJSON(); 
data.dogs = dogCollection.toJSON(); 
// etc 
$.post("/whatever", data); 

관련 문제