#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 в качестве обратного вызова, если ваша синхронизация прошла успешно