2012-07-31 2 views
7

변경된 모델을 데이터베이스에 저장하고 싶습니다 (이전에 설정). 저장이 다른 페이지로 리디렉션되면 (예 : 다른 작업 일 수 있음)콜백이있는 속성을 지정하지 않고 backbone.js로 저장하는 방법

Model.save는 두 가지 선택적 속성을 가질 수 있습니다. 첫 번째는 속성의 해시이고 두 번째는 성공 및 오류 콜백과 같은 옵션입니다. http://backbonejs.org/#Model-save

somemodel.set({foo: 'bar'}); 
//lots of other logic and misc steps the user has to do 
somemodel.save(); //on success should go here 

속성이 이미 설정되어 있으므로 콜백 만 있으면됩니다. 내가했던 과거

:

somemodel.save(somemodel.toJSON(), { 
    success: function() { 
     //other stuff 
    } 
); 

또는 내가 이것을 정리하는 방법을 찾고 있어요

somemodel.save(
    { foo: this.$('input').val()}, 
    { success: function(){} 
); 

방법을 저장에 다시 값을 전달합니다. 문서는 새로운 속성이있는 경우 모델이 변경 상태를 시작한다는 것을 나타냅니다. 하지만 어쨌든 사용자를 리디렉션하고 싶습니다 (새 콘텐츠를 저장하거나 이전/변경하지 않음).

이 존재하지 않습니다

somemodel.on('success', function(){}); 

이를 만 검증을위한 것입니다 : (그것은 또한 파괴 작동하기 때문에)

if(somemodel.save()) { //action } 

또한 "동기화"잘못된 이벤트

도움이 필요하십니까?

답변

12
somemodel.save(
    {}, // or null 
    { 
      success: function(){} 
    } 
); 

을 사용하면 기존 키를 수정하지 않고 특정 콜백 모델을 저장할 수 있습니다.

그리고 http://jsfiddle.net/h5ncaayu/이 옵션으로 성공 콜백을 통과 방지하기 위해

, 당신은

  • 는 약속 save에 의해 반환 사용할 수 있습니다

    바이올린 :

    somemodel.save().then(...youcallback...) 
    
  • 또는 이벤트를 사용 :

    somemodel.on('sync', ...youcallback...); 
    somemodel.save(); 
    
+0

덕분에,이 내가 가진 것보다 확실히 낫다. 나쁘다면 여전히 약간 더러워집니다 (매개 변수를 제공하기 위해 매개 변수를 제공하십시오). 아마 "성공"과 "오류"이벤트를 되돌리기 위해 Backbone.sync를 더 깊이 파고 덮어 써야합니다. 기 본적으로 백본은 이벤트 대 콜백을 느슨하게 연결하기 때문에 기이하다. – Jareish

+1

{} 및 null은이 컨텍스트에서 동일하지 않습니다.{}는 서버에 빈 객체를 보내는 것을 의미하지만 null은 save()에 객체를 전달하지 않고 save()가 객체의 속성을 보내야 함을 의미합니다. – jerzy

+0

@jerzy 맞지 않습니다.'model.save'에 대한 백본 문서를 확인하십시오 :'patch : true' 옵션을 넘겨주지 않으면 리소스의 완전한 표현이 서버로 보내집니다. http://backbonejs.org/# 모델 저장. {} 그리고 null은 같은 행동을 할 것입니다. – nikoshr

3

Backbone.Model에는 "changedAttributes"라는 매우 편리한 메소드가 있는데,이 속성을 통해 전달할 수있는 변경된 속성의 해시가 반환됩니다. 그래서 ...

model.save(
    model.changedAttributes(), 
    { 
     success : _.bind(function() {...},this), //_.bind() will give scope to current "this" 
     error : _.bind(function() {...},this); 
    } 
); 

니스와 깔끔한 ...

+0

또한 훌륭하고 확실히 편리 할 수 ​​있지만 다른 솔루션을 더 선호합니다 (코드가 적음). 그래도 바인딩 좋은 솔루션! 성공/오류 콜백에 액세스 할 수 있도록 항상이 변수를 다른 변수에 저장했지만 더 강력합니다. – Jareish

+0

이 접근법은 변경 이벤트 외부에서 변경된 속성을보고하지 않으므로 changedAttributes()가 실제 변경된 속성 대신 false를 반환 할 가능성이 있습니다. 명심할 것. –

관련 문제