Як запустити зворотний виклик успіху на model.save ()?


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

Модель правильно розміщена на сервері, який обробляє збереження, але зворотний виклик успіху не запускається. Чи потрібно щось відправити назад із сервера?


7
Виявляється, я робив це неправильно: правильний синтаксис повинен бути: this.model.save (newItem, {успіх: ..., помилка: ...})
— Запуск черепахи

8
Здається, "null" також працює нормально як заповнювач.
— UpTheCreek

@UpTheCreek Дякую Це допомогло. Я подивився на джерело і передав порожню рядок як ключ і значення. Як і ваш метод, краще, хоча.
— Прамод

@UpTheCreek null чомусь не працював для мене, але передаючи порожній attr obj зробив :)
— KoalaKid

Відповіді:


123

Перший аргумент збереження - це атрибути, які потрібно зберегти на моделі:

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

9
Я розгублений - (1) Я вважав, що магістраль завжди надсилає всю модель назад під час збереження (що неможливо надсилати часткові оновлення моделі). То яка мета атрибута name-значень? (2) Що робити, якщо ви просто хочете зберегти модель після виконання деяких .set () s - чому список атрибутів? (3) У документах параметр списку атрибутів відображається як необов'язковий. Ви можете уточнити? Дякую.
— UpTheCreek

7
Ви можете зробити купу "набору" зі своїми атрибутами, а потім зберегти без будь-яких атрибутів. Усі атрибути моделі завжди надсилаються на сервер. Зберегти за допомогою атрибутів - це лише ярлик для встановлення + збереження.
— Жульєн

5
Як нерозумно це здається, саме це і робиться, соромно, це погано задокументовано.
— Кевін

51
У моєму тестуванні виявляється, що зворотні виклики успіху та помилок не звільняються, якщо ви не передаєте щось для параметра "атрибути". Це, здається, суперечить документації ... model.save ([атрибути], [параметри]) вказуватиме на те, що атрибути необов'язкові. Коли я включаю атрибути або null для атрибутів, мої зворотні виклики успіху та помилки звільняються. Коли я не включаю нічого до атрибутів, зворотні виклики НЕ запускаються.
— Кевін

6
перевірили вихідний код backbone.js [ backbonejs.org/docs/backbone.html ]. здається, що attr є обов'язковим .. якщо буде надано лише "option", функції припускають, що він є "attr" і переплутує виклик
— Kumaresan

58

Для деяких невідомих причини жоден із перерахованих вище методів не працював для мене. Апі тільки в моєму випадку не потрапив.

Але пізніше, шукаючи це, я наткнувся на це посилання , де хтось намагався nullзамість цього {}як перший параметр.

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

так, це працювало для мене. Сподіваюся, це теж допоможе вам.


3
Це правильна відповідь. Якщо ви введете null Backbone надішле всі атрибути серверу для збереження.
— Пол Олівер

Дивна химерність, але мій вибраний метод.
— Метт Флетчер

37

Ваш сервер повинен повернути об'єкт JSON. Якщо відповідь не є об'єктом JSON, зворотні виклики не запускаються.

Якщо для успіху ваш сервер не повертає об'єкт JSON, виконайте збереження з dataType: "text" опцією, наприклад:

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

За допомогою цієї опції він не буде чекати JSON у відповідь, а текст, і, таким чином, буде запущено зворотний виклик.


Святе лайно дякую. Це водило мене бонкерами. Було б дивовижно, якби це десь було зафіксовано в документах "Хребна основа"
— Tobias J

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

Дуже дякую! Це зробило мій день.
— alcfeoh

11

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

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");
        }
    });

EDIT: Я не могла відповісти вам чомусь, але можу редагувати

але вам не потрібно встановлювати ідентифікатор: 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");
   }
});

Ура

Roy MJ


дещо відволікає передати локальний modelна this.model.. modelмає бути attributes, які встановлюються та зберігаються разом із усім уthis.model
— Funkodebat

@Funkodebat: Так. :) .. Насправді я вважав, що це схоже на звичайний jquery-ajax, але в Backbone першим параметром буде модель. Не обов’язково передавати його, а скоріше отримати відповідний. Це насправді дуже тривожно .. :(
— Roy MJ

Ну, правда, ні, ви не передаєте модель при виклику збереження. перший аргумент збереження - це додаткові атрибути, які ви можете встановити перед викликом збереження. Це було б як дзвонити model.set(model.toJSON()); model.save(). немає ніяких причин встановлювати модель для того, на що встановлена ​​модель. Це є надлишковим моментом передавати модель собі під час збереження.
— Функодебат

2
@Funkodebat Я відхилив ваші зміни до цієї трирічної відповіді, оскільки вони докорінно змінили відповідь автора. Це не мета системи редагування / модерації. Якщо відповідь більше не відповідає або підходить, пропишіть її та напишіть нову. Інструменти модерування призначені для фіксації граматики, форматування, написання та написання великої літери, а не для коригування відповідей інших користувачів.
— дістатися4thelasers

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.