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

#backbone.js

#backbone.js

Вопрос:

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

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

Комментарии:

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

2. ‘null’, похоже, тоже нормально работает в качестве заполнителя.

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

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

Ответ №1:

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

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

Комментарии:

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

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

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

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

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

Ответ №2:

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

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

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

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

Комментарии:

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

2. Странная особенность, но выбранный мной метод.

Ответ №3:

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

Если при успешном выполнении ваш сервер не возвращает объект JSON, выполните сохранение с помощью опции DataType: «text», например:

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

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

Комментарии:

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

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

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

Ответ №4:

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

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

Ответ №5:

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

я вызываю 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");
    }
});
  

Ответ №6:

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

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

Приветствия

Рой М Джей

Комментарии:

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

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

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

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

5. Сообщество с вами не согласится. Это высоко оцененный вопрос с высоко оцененным лучшим ответом. Вопрос кажется актуальным для сообщества. Если вы с чем-либо не согласны, используйте кнопку «Проголосовать против». Не ваше дело диктовать, какие вопросы и ответы имеют право находиться на этом сайте, и уж точно не ваше дело изменять ответы других пользователей до такой степени, что их смысл кардинально меняется.

Ответ №7:

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

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

Ответ №8:

При инициализации функции привяжите метод sync к определяемому вами методу (onSaveSuccess)

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

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