2016-05-20 2 views
0

アプリケーションに非常に複雑なフォームがあり、ユーザーがわずかなフィールドしか変更できない更新機能があります。保存ボタンをクリックしてサーバーにデータを送信します。私のアプリケーションは、バックボーン、サイフォン、JQuery、アンダースコアを使用しています。バックボーンモデルで変更されたフィールドのみを送信

アプリケーション内の複数のページで使用できるこれらのライブラリのみを使用して、どのフィールドをサーバーに送信するかを制御する最適な方法は何ですか?再利用可能な機能のようなものが役立ちます。

model.changedAttributes()期待どおり機能していないように見えました。ほとんどの場合、それは偽を返しています。サイフォンを使用してフォームデータをシリアル化し、APIに送信するアプリ固有のフォーマットに変換する次のコードがあります。

formSave: function(e) { 
    var data = changeToWriteApiFormat(Backbone.Syphon.serialize($(e.currentTarget).closest('form.event_form')[0])); 
    this.model.clear(); 
    this.model.id = this.parentObj.model.id; 

    this.model.set(data); 

    if (this.model.isValid(true)) { 
     this.model.save(removeObjIndexCollection(data), { 
      url: this.model.url().replace(gc.readApiUrl, gc.publishApiUrl), 
      patch: true, 
      beforeSend: ToolsHelper.setPublishHeader, 
      success: function(model, response) { 
      $('#event_success').show(); 
      $('#event_failure').hide(); 
      }, 
      error: function(model, response) { 
      $('#event_failure').show(); 
      $('#event_success').hide(); 
      } 

     } 
     } 
+0

formSave: function(e) { var data = changeToWriteApiFormat(Backbone.Syphon.serialize($(e.currentTarget).closest('form.event_form')[0])); this.parentObj.model.save(removeObjIndexCollection(data), { url: this.model.url().replace(gc.readApiUrl, gc.publishApiUrl), patch: true, beforeSend: ToolsHelper.setPublishHeader, success : function(model, response) { $('#event_success').show(); $('#event_failure').hide(); }, error : function(model, response) { $('#event_failure').show(); $('#event_success').hide(); } } } 

編集:changedAttributesのここでの例を変更されたフィールドを検出するカスタムロジックで「保存」します。 –

+0

私はいくつかのinbuiltソリューションを探しています。 – user1614862

答えて

0

model.changedAttributes(あなたがthis.modelに前に設定され、いくつかの属性を持っていた場合は、しかし、あなたがthis.model.clear経由でそれらをcleard以降)のみ動作します(); falseを返します。

また、「保存」はvalidateが有効な場合にのみ実行され、isValidを呼び出す必要はありません。

"patch:true"属性は正しいですが、以前の値を設定した場合にのみ機能します。

この試してください:あなたがサーバーに送信されます何を制御したい場合は、最高の場所は `として懸念メソッドをオーバーライドすることです

var model = new Backbone.Model(); 

model.set({ 
    val1 : 'init', 
    val2 : 'init' 
}); 

// .. whatever 

var newChangesFromForm = { 
    val2 : "changed", 
    val1 : 'init' // won't be set, because it's the same value 
}; 
model.on('change', function() { 
    var changes = model.changedAttributes(); 

    alert(JSON.stringify(changes)); 
}); 
model.set(newChangesFromForm); 
+0

モデルを消去する前にmodel.changedAttributes()を呼び出してみました。うまく行かなかった。私のモデルには、ビューの初期化時に設定された初期属性があります。唯一の問題は、model.changedAttributes()を呼び出すときに、これらの2つの値のセットを区別できないことです。それは明らかでなくても常に偽に戻ります。 – user1614862

+0

私は.changedAttributes()で例を追加しました。 – zoggole

関連する問題