Backbone.js с настраиваемым URL-адресом извлечения
Я пытаюсь настроить метод выборки на моей базовой модели, который будет отображать текущую модель для данного пользователя. Это доступно в API на /api/mealplans/owner/{username}/current
.
Я написал следующую модель. Я прокомментировал URL-адрес Root, так как вызов fetch prototype был просто с помощью urlRoot
, и я хотел посмотреть, было ли это переопределение параметра url, который я каким-то образом передал.
var mealPlan = Backbone.Model.extend({
name: 'Meal Plan',
//urlRoot: '/api/mealplans',
defaults: {},
fetchCurrent: function (username, attributes, options) {
attributes = attributes || {};
options = options || {};
if (options.url === undefined) {
options.url = "/api/mealplans/owner/" + username + "/current";
}
return Backbone.Model.prototype.fetch.call(this, attributes, options);
},
validate: function (attributes) {
// To be done
return null;
}
});
Я видел это, в некоторых вариантах в других местах, например, в backbone.js используют разные URL-адреса для сохранения и выбора модели - в этом случае код немного отличается (я начал с этого и сломал его, чтобы облегчить мне чтение.)
Объект options имеет параметр url в нем отлично, когда я передаю его для извлечения, но тогда он, кажется, игнорирует его!
Ответы
Ответ 1
Я принимал одни и те же параметры для извлечения, как и для сохранения. Это не так.
В сигнатуре метода для выборки используется только "параметры", а не "атрибуты", поэтому параметр url не найден.
Код модели должен выглядеть примерно так.
var mealPlan = Ministry.Model.extend({
name: 'Meal Plan',
urlRoot: '/api/mealplans',
defaults: {
},
fetchCurrent: function (username, options) {
options = options || {};
if (options.url === undefined) {
options.url = this.urlRoot + "/owner/" + username + "/current";
}
return Backbone.Model.prototype.fetch.call(this, options);
},
validate: function (attributes) {
// To be done
return null;
}
});
Ответ 2
Я думаю, что лучше переопределить метод url(), как показано ниже:
var mealPlan = Ministry.Model.extend({
name: 'Meal Plan',
urlRoot: '/api/mealplans',
//--> this gets called each time fetch() builds its url
url: function () {
//call the parent url()
var url=Backbone.Model.prototype.url.call(this);
//here you can transform the url the way you need
url += "?code=xxxx";
return url;
}
...
Кроме того, в вашем примере выше я думаю, что есть ошибка, и вы должны заменить fetchCurrent на fetch