Backbone Fetch success callback не выполняется, когда ответ выборки является пустым массивом

63
7

У меня есть модель Person и я получаю информацию о пользователе внутри представления. Обратный вызов success FetchSuccess выполняется, когда ответ имеет объект. Но когда ответ пуст, обратный вызов не вызывается. Любой Угадай?

Models.Basic = Backbone.Model.extend({
parse: function(response) {
return response;
}
});

Models.PersonModel = Backbone.Model.extend({
url: function() {
return '/person/' + this.data.id;
}
});

Backbone.View.extend({

template: Templates['template'],

initialize: function(options) {
this.id = options.id;
_.bindAll(this, 'FetchSuccess');

this.personModel = new Models.PersonModel();
this.model = new Models.Basic();
this.fetchData();
return this;
},

render: function() {
this.$el.append(this.template(this.model.toJSON()));
},

fetchData: function() {
this.personModel.data = {
id: this.id
};
this.personModel.fetch({
context: this,
success: this.FetchSuccess
});
},

FetchSuccess: function() {
this.model.set({
name: this.personModel.get('name');
});
this.render();
}
});

спросил(а) 2021-01-25T22:42:17+03:00 4 месяца, 4 недели назад
1
Решение
63

this.personModel = new Models.PersonModel();

Это модель Backbone, а не коллекция.

this.personModel.fetch({
reset: true, // this doesn't exist on model
success: this.FetchSuccess
});

Вы не можете получить модель без id. Кроме того, модель при извлечении ожидает возврата объекта.

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

this.personModel = new Models.PersonModel({ id: "id_here" });
// ...
this.personModel.fetch({
context: this,
success: this.FetchSuccess
});

Здесь код с исправлениями

// parse isn't needed if you're not going to parse something
Models.Basic = Backbone.Model.extend({});

Models.PersonModel = Backbone.Model.extend({
urlRoot: 'person/', // this handles putting the id automatically
});

Backbone.View.extend({
template: Templates['template'],

initialize: function(options) {
this.id = options.id;

// pass the id here
this.personModel = new Models.PersonModel({ id: this.id });

this.model = new Models.Basic();
this.fetchData();

// makes no sense in the initialize since it never called
// manually and never used to chain calls.
// return this;
},

render: function() {
// render should be idempotent, so emptying before appending
// is a good pattern.
this.$el.html(this.template(this.model.toJSON()));

return this; // this is where chaining could happen
},

fetchData: function() {
// This makes no sense unless you've stripped the part that uses it.
// this.personModel.data...

this.personModel.fetch({
context: this, // pass the context, avoid '_.bindAll'
success: this.onFetchSuccess,
error: this.onFetchError
});
},

onFetchSuccess: function() {
this.model.set({
name: this.personModel.get('name')
});
this.render();
},
onFetchError: function() { this.render(); }

});

Вы могли поймать ошибку с обратным вызовом error или просто ничего не делать и визуализировать по умолчанию, а также повторно отображать на выборке.

Вы также можете прослушивать события модели (внутри initialize):

this.listenTo(this.personModel, {
'sync': this.FetchSuccess,
'error': this.onFetchError
});
this.personModel.fetch();

ответил(а) 2021-01-25T22:42:17+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема