Como faço para acionar o retorno de chamada de sucesso em um model.save ()?


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

O modelo é postado corretamente no servidor que lida com o salvamento, mas o retorno de chamada de sucesso não é acionado. Eu preciso enviar algo de volta do servidor?


7
Acontece que eu estava fazendo errado: a sintaxe correta deveria ser: this.model.save (newItem, {sucesso: ..., erro: ...})
Running Turtle em

8
'null' também parece funcionar bem como marcador de posição.
UpTheCreek de

Obrigado @UpTheCreek. Isso ajudou. Eu olhei para a fonte e passei uma string vazia como chave e valor. Mas goste melhor do seu método.
Pramod de

@UpTheCreek null não funcionou para mim por algum motivo, mas passar um obj de
atributo

Respostas:


123

O primeiro argumento de salvar são os atributos a serem salvos no modelo:

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

9
Estou um pouco confuso - (1) Achei que o backbone sempre enviava o modelo inteiro de volta durante o salvamento (que não é possível enviar atualizações parciais do modelo). Então, qual é o propósito dos valores de nome de atributo? (2) E se você quiser apenas salvar o modelo depois de executar alguns .set () s - por que a lista de atributos? (3) Nos documentos, o parâmetro da lista de atributos é mostrado como opcional. Você pode esclarecer? Obrigado.
UpTheCreek de

7
Você pode fazer um monte de "set" com seus atributos e depois salvar sem nenhum atributo. Todos os atributos do modelo são sempre enviados ao servidor. Salvar com atributos é apenas um atalho para definir + salvar.
Julien

5
Por mais bobo que pareça, isso é exatamente o que faz, uma pena que esteja mal documentado.
Kevin

51
Parece em meus testes que os callbacks de sucesso e erro não são disparados se você não passar algo para o parâmetro "atributos". Isso parece contradizer a documentação ... model.save ([atributos], [opções]) indicaria que os atributos são opcionais. Quando incluo atributos ou nulo para os atributos, meus retornos de chamada de sucesso e erro são disparados. Quando eu não incluo nada para os atributos, os callbacks NÃO são disparados.
Kevin

6
verifiquei o código-fonte de backbone.js [ backbonejs.org/docs/backbone.html ]. parece que o attr é obrigatório .. se apenas 'opção' for fornecida, as funções presumem que seja o 'attr' e atrapalha a chamada
Kumaresan

58

Para algum desconhecido razão , nenhum dos métodos acima funcionou para mim. A api só não foi atingida no meu caso.

Mas mais tarde, enquanto pesquisava sobre isso, encontrei este link , onde alguém havia tentado em nullvez de {}como o primeiro parâmetro.

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

então, isso funcionou para mim. Espero que isso ajude voçe tambem.


3
Essa é a resposta correta. Se passar em Backbone nulo irá enviar todos os atributos ao servidor para salvamento.
Paul Oliver

Estranha peculiaridade, mas meu método escolhido.
Matt Fletcher,

37

Seu servidor deve retornar um objeto JSON. Se a resposta não for um objeto JSON, os retornos de chamada não serão disparados.

Se, para ter sucesso, seu servidor não retornar um objeto JSON, execute um salvamento com a opção dataType: "text" , assim:

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

Com esta opção, não ficará à espera de uma resposta JSON, mas sim de um texto, e assim será lançado o callback.


Puta merda, obrigado. Isso estava me deixando maluco. Seria incrível se isso fosse documentado nos documentos do Backbone em algum lugar,
Tobias J

isso salvou minha bunda. Eu estava usando res.json ({sucesso: resultado}) com Express 4, e isso ainda estava me dando problemas. Talvez eu precise fazer: res.json ({"sucesso": "resultado"}) ou algo ...
Alexander Mills

Muito obrigado! Isto fez o meu dia.
alcfeoh

11

Você pode usar a lib de sublinhado como segue, pois o backbone já depende disso. Lembre-se de que o primeiro argumento de salvar deve ter atributos ou você pode apenas passar {} no caso de querer salvar o próprio modelo.

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

8

Estou um pouco confuso - ainda preciso passar todos os atributos para chamar um evento de salvamento? e se meu modelo for grande ... eu não desejo definir todas as propriedades manualmente

estou chamando model.save e tentando fazer o seguinte:

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

ok apenas para responder à minha própria pergunta caso alguém encontre este post, eu fiz o seguinte que funciona:

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

EDIT: Não pude responder a você por algum motivo, mas posso editar

mas você não precisa definir o id: this.model.get('id')você pode simplesmente passar um objeto em branco porque um atributo em branco simplesmente não estende atributos, não faz nada:

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

4

A seguir está o código que estou usando para salvar o modelo de backbone.

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

Felicidades

Roy MJ


é um pouco perturbador passar um local modelpara um this.model.. modeldeveria ser attributes, que são definidos e salvos junto com tudo emthis.model
Funkodebat

@Funkodebat: Sim. :) .. Eu realmente pensei que isso fosse semelhante ao jquery-ajax normal, mas no Backbone, o primeiro parâmetro seria o modelo. Não necessariamente passando, mas sim obtendo o correspondente. Na verdade, é bastante perturbador .. :(
Roy MJ

Bem, a verdade é que não, você não passa no modelo ao chamar save. o primeiro argumento de save são atributos extras que você pode definir antes de chamar save. Seria como ligar model.set(model.toJSON()); model.save(). não há razão para definir um modelo para o que o modelo está definido .. é o epítome de redundante para passar um modelo para si mesmo ao salvar.
Funkodebat

2
@Funkodebat Rejeitei suas alterações nesta resposta de 3 anos, pois mudaram radicalmente a resposta do autor. Esta não é a intenção do sistema de edição / moderação. Se a resposta não for mais relevante ou apropriada, vote e escreva uma nova. As ferramentas de moderação servem para corrigir a gramática, formatação, ortografia e capitalização - não para ajustar as respostas de outros usuários.
reach4thelasers

2
A comunidade discordaria de você. É uma questão bem votada com uma resposta bem votada. A questão parece relevante para a comunidade. Se você discordar de alguma coisa, use o botão de votação negativa. Não é sua função ditar quais perguntas e respostas têm o direito de estar neste site, e certamente não é sua função modificar as respostas de outros usuários a ponto de seu significado ser drasticamente alterado.
reach4thelasers de

1

Para quem deseja salvar um modelo, sem atualizar os atributos, pode fazer o seguinte:

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

1

Ao inicializar a função, vincule o método de sincronização a um método definido por você (onSaveSuccess)

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

Dessa forma, sempre que você executar this.model.save (), ele executará a função onSaveSuccess como um retorno de chamada se sua sincronização for bem-sucedida

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.