Bir model.save () üzerindeki başarı geri aramasını nasıl tetiklerim?


106
this.model.save({
  success: function(model, response){
    console.log('success');
  },
  error: function(){
    console.log('error');
  }
})

Model, kaydetmeyi gerçekleştiren sunucuya doğru bir şekilde gönderilir, ancak başarı geri araması tetiklenmez. Sunucudan geri bir şey göndermem gerekiyor mu?


7
Dönüşler Yanlış yapıyordu dışarı: Doğru sözdizimi olmalıdır: this.model.save (newItem, {başarı: ..., hata: ...})
Kaplumbağa Running

8
'null' da bir yer tutucu olarak iyi çalışıyor gibi görünüyor.
UpTheCreek

@UpTheCreek Teşekkürler. Bu yardımcı oldu. Kaynağa baktım ve anahtar ve değer olarak boş bir dizge geçtim. Metodun gibi daha iyi.
Pramod

@UpTheCreek null bir sebepten dolayı benim için işe yaramadı ama boş bir attr
objeyi geçmek

Yanıtlar:


123

Save'in ilk argümanı, modele kaydedilecek niteliklerdir:

this.model.save( {att1 : "value"}, {success :handler1, error: handler2});

9
Biraz kafam karıştı - (1) Omurganın her zaman tüm modeli geri gönderdiğini düşündüm (kısmi model güncellemelerini göndermenin mümkün olmadığını). Öyleyse öznitelik ad değerlerinin amacı nedir? (2) Ya bazı .set () s yaptıktan sonra modeli kaydetmek istiyorsanız - neden öznitelik listesi? (3) Dokümanlarda, öznitelik listesi parametresi isteğe bağlı olarak gösterilir. Açıklayabilir misin? Teşekkürler.
UpTheCreek

7
Özniteliklerinizle bir dizi "set" yapabilir ve ardından herhangi bir öznitelik olmadan bir kaydetme yapabilirsiniz. Modelin tüm öznitelikleri her zaman sunucuya gönderilir. Niteliklerle kaydetme, yalnızca ayarlamak + kaydetmek için bir kısayoldur.
Julien

5
Ne kadar aptalca görünse de, tam olarak yaptığı şey bu, kötü bir şekilde belgelenmesi utanç verici.
Kevin

51
Testimde, "öznitelikler" parametresi için bir şey iletmezseniz, başarı ve hata geri aramalarının tetiklenmediği görülüyor. Bu, dokümantasyonla çelişiyor gibi görünüyor ... model.save ([öznitelikler], [seçenekler]) özniteliklerin isteğe bağlı olduğunu gösterir. Öznitelikler için öznitelikler veya null eklediğimde, başarı ve hata geri aramalarım tetikleniyor. Öznitelikler için herhangi bir şey eklemediğimde, geri aramalar tetiklenmez.
Kevin

6
backbone.js [ backbonejs.org/docs/backbone.html ] kaynak kodunu kontrol etti . Görünüşe göre öznitelik zorunludur ... eğer sadece 'seçenek' sağlanırsa, işlevler bunun 'öznitelik' olduğunu varsayar ve aramayı karıştırır
Kumaresan

58

Bazıları için bilinmeyen bir nedenle, yukarıdaki yöntemin hiçbiri benim için çalıştı. API yalnızca benim durumumda vurulmadı.

Ama daha sonra bunu araştırırken, birisinin ilk parametre yerine denediği bu bağlantıya rastladım .null{}

this.model.save(null, {
    success: function (model, response) {
        console.log("success");
    },
    error: function (model, response) {
        console.log("error");
    }
});

yani, bu benim için çalıştı. Umarım bu da size yardımcı olur.


3
Bu doğru cevap. Boş değerde geçerseniz, Backbone tüm öznitelikleri kaydetmek için sunucuya gönderir.
Paul Oliver

Garip tuhaf ama benim seçtiğim yöntem.
Matt Fletcher

37

Sunucunuz bir JSON nesnesi döndürmelidir. Yanıt bir JSON nesnesi değilse, geri aramalar başlatılmaz.

Başarılı olmak için sunucunuz bir JSON nesnesi döndürmezse, dataType: "text" seçeneğiyle aşağıdaki gibi bir kaydetme gerçekleştirin :

this.model.save([],{
 dataType:"text",
 success:function() {},
 error:function() {}
});

Bu seçenekle, yanıt olarak bir JSON beklemeyecek, ancak bir metin ve dolayısıyla geri arama başlatılacaktır.


Vay canına, teşekkürler. Bu beni deli ediyordu. Bu, Backbone belgelerinde bir yerde belgelenseydi harika olurdu,
Tobias J

bu kıçımı kurtardı. Express 4 ile res.json ({success: result}) kullanıyordum ve bu hala bana sorun yaratıyordu. Belki de yapmam gerekiyor: res.json ({"success": "result"}) veya başka bir şey ...
Alexander Mills

Çok teşekkürler! Bu benim günümü yaptı.
alcfeoh

11

Alt çizgi lib'yi aşağıdaki gibi kullanabilirsiniz, çünkü omurga zaten buna bağlıdır. Save'in ilk bağımsız değişkeninin ya özniteliklere sahip olması gerektiğini ya da modelin kendisini kaydetmek istemeniz durumunda sadece {} 'ı geçebileceğinizi unutmayın.

this.model.save({}, _.bind(function(model, response){
  //Do whatever you want e.g.
  this.collection.add(model)
}, this))

8

Bu yüzden biraz kafam karıştı - bir save olayını çağırabilmem için yine de tüm nitelikleri geçmem gerekiyor mu? ya modelim büyükse .. her özelliği manuel olarak ayarlamak istemiyorum

model.save'i çağırıyorum ve aşağıdakileri yapmaya çalışıyorum:

this.model.save(
    {
        success: function (model, response) {
            console.log('model saved');
        }
    });

Tamam, herhangi birinin bu yazıyı bulması durumunda kendi sorumu cevaplamak için, aşağıdakileri yaptım ve işe yaradı:

this.model.save({ id: this.model.get('id') },
    {
        success: function (model, response) {
            console.log("success");
        },
        error: function (model, response) {
            console.log("error");
        }
    });

DÜZENLEME: Herhangi bir nedenle size yanıt veremedim, ancak düzenleyebilirim

ancak id ayarlamanız gerekmez: this.model.get('id')boş bir nesneyi iletebilirsiniz çünkü boş bir özellik nitelikleri genişletmez, hiçbir şey yapmaz:

this.model.save({}, {
    success: function (model, response) {
        console.log("success");
    },
    error: function (model, response) {
        console.log("error");
    }
});

4

Omurga model kaydı için kullandığım kod aşağıdadır.

this.model.save(model,{
   success:function(model){
       console.log("Saved Successfully");
   },
   error:function(model){
       console.log("Error");
   }
});

Şerefe

Roy MJ


bir yerelin , içindeki her şeyle birlikte ayarlanan ve kaydedilen modelbir this.model.. modelolması gerektiği gibi aktarılması biraz rahatsız ediciattributesthis.model
Funkodebat

@Funkodebat: Evet. :) .. Aslında bunun normal jquery-ajax'a benzer olduğunu düşünmüştüm ama Backbone'da ilk parametre model olurdu. Mutlaka geçmek değil, karşılık gelen olanı almak. Gerçekten oldukça rahatsız edici .. :(
Roy MJ

Gerçek şu ki, hayır, Save'i ararken modeli geçemezsin. kaydetmenin ilk argümanı, kaydetmeyi çağırmadan önce ayarlayabileceğiniz ekstra özniteliklerdir. Aramak gibi olur model.set(model.toJSON()); model.save(). modelin ayarlandığı şeye bir model ayarlamak için hiçbir neden yoktur .. kaydederken bir modeli kendisine geçirmek artıklığın özüdür.
Funkodebat

2
@Funkodebat Yazarın cevabını kökten değiştirdikleri için bu 3 yıllık cevaba yaptığınız değişiklikleri reddettim. Düzenleme / moderasyon sisteminin amacı bu değildir. Cevap artık alakalı değilse veya uygun değilse, oylayın ve yenisini yazın. Denetim araçları dilbilgisi, biçimlendirme, yazım ve büyük harf kullanımını düzeltmek içindir - diğer kullanıcıların yanıtlarını ayarlamak için değildir.
reach4thelasers

2
Topluluk size karşı çıkacaktır. Yüksek oy alan en iyi cevaba sahip, çok oylanmış bir soru. Soru toplulukla alakalı görünüyor. Herhangi bir şeye katılmıyorsanız, oylama düğmesini kullanın. Hangi soruların ve cevapların bu sitede bulunma hakkına sahip olduğunu dikte etmek sizin yeriniz değil ve kesinlikle diğer kullanıcıların cevaplarını anlamlarının büyük ölçüde değiştiği noktaya kadar değiştirmek sizin yeriniz değil.
reach4thelasers

1

Bir modeli kaydetmek isteyenler için öznitelikleri güncellemeden aşağıdakileri yapabilirsiniz:

model.once("sync", function(model, response, options){
    //
});
model.once("error", function(model, response, options){
    //
});
model.save();

1

İşlevi başlatırken, eşitleme yöntemini tanımladığınız bir yönteme bağlayın (onSaveSuccess)

            initialize: function (options) {
                    this.model.on('sync', _.bind(this.onSaveSuccess, this));
},
            onSaveSuccess: function() {
                console.log('saved');
                this.render();
            },

Bu şekilde, this.model.save () 'yi her çalıştırdığınızda, eşitlemeniz başarılı olursa, onSaveSuccess işlevini bir geri arama olarak çalıştırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.