Как запустить обратный вызов успеха для model.save ()?


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

Модель правильно отправляется на сервер, который обрабатывает сохранение, но обратный вызов успеха не запускается. Мне нужно что-то отправить с сервера?


7
Оказывается, я делал это неправильно: правильный синтаксис должен быть: this.model.save (newItem, {success: ..., error: ...})
Запуск Turtle

8
'null', похоже, тоже работает как заполнитель.
UpTheCreek

@UpTheCreek Спасибо. Это помогло. Я посмотрел на источник и передал пустую строку как ключ и значение. Хотя ваш метод лучше.
Pramod

@UpTheCreek null по какой-то причине не сработал для меня, но передача пустого
объекта

Ответы:


123

Первый аргумент save - это атрибуты для сохранения в модели:

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

9
Я немного запутался - (1) я думал, что магистраль всегда отправляет всю модель обратно во время сохранения (что невозможно отправлять частичные обновления модели). Итак, каково назначение значений атрибута? (2) Что, если вы просто хотите сохранить модель после выполнения некоторых .set () s - почему список атрибутов? (3) В документации параметр списка атрибутов показан как необязательный. Вы можете уточнить? Спасибо.
UpTheCreek

7
Вы можете выполнить несколько «наборов» с вашими атрибутами, а затем выполнить сохранение без каких-либо атрибутов. Все атрибуты модели всегда отправляются на сервер. Сохранить с атрибутами - это просто ярлык для установки + сохранения.
Жюльен

5
Как бы глупо это ни казалось, это именно то, что он делает, жаль, что это плохо документировано.
Кевин

51
В моем тестировании выяснилось, что обратные вызовы успеха и ошибки не запускаются, если вы не передаете что-то в параметре "attributes". Кажется, это противоречит документации ... model.save ([attributes], [options]) указывает, что атрибуты являются необязательными. Когда я включаю атрибуты или null для атрибутов, мои обратные вызовы успеха и ошибки запускаются. Когда я ничего не включаю в атрибуты, обратные вызовы НЕ запускаются.
Кевин

6
проверил исходный код backbone.js [ backbonejs.org/docs/backbone.html ]. кажется, что атрибут attr является обязательным ... если предоставляется только 'option', функции предполагают, что это 'attr', и
портят

58

По неизвестной причине ни один из вышеперечисленных способов у меня не помог. В моем случае не пострадал только api.

Но позже, ища по этому поводу , я наткнулся на эту ссылку , где кто-то пробовал, nullа не в {}качестве первого параметра.

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

Итак, это сработало для меня. Надеюсь, это тебе тоже поможет.


3
Это правильный ответ. Если вы передадите значение null, Backbone отправит все атрибуты на сервер для сохранения.
Paul Oliver

Странная причуда, но выбранный мной метод.
Мэтт Флетчер

37

Ваш сервер должен вернуть объект JSON. Если ответ не является объектом JSON, обратные вызовы не будут срабатывать.

Если для успеха ваш сервер не возвращает объект JSON, выполните сохранение с параметром dataType: "text" , например:

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

С этой опцией он будет ждать не JSON в ответ, а текст, и, таким образом, будет запущен обратный вызов.


Черт побери, спасибо. Это сводило меня с ума. Было бы здорово, если бы это было задокументировано где-нибудь в документации по Backbone,
Тобиас Дж.

это спасло мою задницу. Я использовал res.json ({success: result}) с Express 4, и это все еще вызывало у меня проблемы. Возможно, мне нужно сделать: res.json ({"success": "result"}) или что-то в этом роде ...
Александр Миллс

Большое спасибо! Это сделало мой день.
alcfeoh

11

Вы можете использовать библиотеку подчеркивания следующим образом, так как от этого уже зависит магистраль. Помните, что первый аргумент save должен либо иметь атрибуты, либо вы можете просто передать {}, если хотите сохранить саму модель.

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

8

так что я немного запутался - мне все еще нужно передать все атрибуты, чтобы я мог вызвать событие сохранения? что, если моя модель большая .. я не хочу устанавливать каждое свойство вручную

Я вызываю model.save и пытаюсь сделать следующее:

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

Хорошо, просто чтобы ответить на мой собственный вопрос, если кто-то найдет этот пост, я сделал следующее, что работает:

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

РЕДАКТИРОВАТЬ: Я не мог ответить вам по какой-то причине, но могу отредактировать

но вам не нужно устанавливать id: this.model.get('id')вы можете просто передать пустой объект, потому что пустой атрибут просто не расширяет атрибуты, ничего не делает:

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

4

Ниже приведен код, который я использую для сохранения модели магистрали.

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

Ура

Рой MJ


несколько отвлекает передача локального modelв this.model... modelдолжны быть attributes, которые устанавливаются и сохраняются вместе со всем вthis.model
Funkodebat

@Funkodebat: Да. :) .. Я действительно думал, что это похоже на обычный jquery-ajax, но в Backbone первым параметром будет модель. Не обязательно прохождение, а получение соответствующего. Это действительно очень тревожно .. :(
Рой MJ

Ну правда в том, что нет, вы не передаете модель при вызове save. первый аргумент save - это дополнительные атрибуты, которые вы можете установить перед вызовом save. Это было бы похоже на звонок model.set(model.toJSON()); model.save(). нет причин устанавливать для модели то, что она настроена ... это воплощение избыточности для передачи модели самой себе при сохранении.
Funkodebat

2
@Funkodebat Я отклонил ваши изменения в этом ответе трехлетней давности, поскольку они радикально изменили ответ автора. Это не является целью системы редактирования / модерации. Если ответ больше не актуален или не подходит, проголосуйте против и напишите новый. Инструменты модерации предназначены для исправления грамматики, форматирования, орфографии и использования заглавных букв, а не для корректировки ответов других пользователей.
rich4thelasers

2
Сообщество не согласится с вами. Это вопрос, получивший большое количество голосов, и самый популярный ответ. Вопрос кажется актуальным для сообщества. Если вы с чем-то не согласны, используйте кнопку "проголосовать против". Не ваше дело диктовать, какие вопросы и ответы имеют право находиться на этом сайте, и, конечно же, не ваше дело изменять ответы других пользователей до такой степени, что их значение резко изменится.
Ричард 4thelasers

1

Для тех, кто хочет сохранить модель, не обновляя атрибуты, вы можете сделать следующее:

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

1

При инициализации функции привяжите метод синхронизации к методу, который вы определяете (onSaveSuccess)

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

Таким образом, каждый раз, когда вы запускаете this.model.save (), он запускает функцию onSaveSuccess в качестве обратного вызова, если ваша синхронизация прошла успешно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.