Backbone.js + Require.js: URL-адрес коллекции установлен, но появляется сообщение об ошибке "Uncaught Error: необходимо указать свойство или функцию url"
В настоящее время я работаю над фреймворком для проекта, который мы разделили на код веб-клиента и сервера. Код клиента использует комбинацию require.js и backbone.js. В настоящее время я работаю над настройкой связи между клиентом и сервером, и в идеале мы хотели бы иметь возможность использовать встроенную функциональность магистрали.sync (и извлеченный из нее вызов fetch).
Тем не менее, я сталкиваюсь с нечетной серией ошибок.
Когда код выполняется, я получаю следующую ошибку в консоли. "Uncaught Error: необходимо указать свойство или функцию url"
Это соответствующие прокладки из нашего main.js
require.config({
paths: {
'jQueryBase': '../vendor/jquery-1.10.2/jquery-1.10.2',
'jQuery': '../vendor/jquery-ui-1.10.3/ui/jquery-ui',
'underscore': '../vendor/underscore/underscore',
'backbone': '../vendor/backbone/backbone',
'handlebars': '../vendor/handlebars/handlebars-v1.1.2 '
},
shim: {
'jQuery': {
exports: '$',
deps: ['jQueryBase']
},
'underscore': {
exports: '_'
},
'backbone': {
exports: 'Backbone',
deps: ['underscore', 'jQueryBase']
},
'handlebars': {
exports: 'Handlebars'
}
},
waitSeconds: 0
});
Это наш dogModel.js
define(['backbone'],
function (Backbone) var DogModel = Backbone.Model.extend({
});
return DogModel;
});
Это наш dogCollection.js
define {
('backbone',
'../models/dogModel'
J,
function (Backbone,
DogModel) {
var DogCollection = Backbone.Collection.extend({
model: DogModel,
url: '/dogs',
});
return DogCollection;
});
Это наш dogData.js
define(['../collections/dogCollection',
'../models/dogModel'
],
function (DogCollection,
DogModel) {
var dogDataModule = {};
dogDataModule.dogList = new DogCollection();
//this request works
$.ajax(
type: "GET",
dataType: "json",
url: "http://localhost:7001/SERVICES/dogs",
success: function (data) {
dogDataArray = data;
for (var i = 0; i < dogDataArray.length; i++) {
var dogData = dogDataArray[i];
var dogModel = new DogModel();
dogModel.set(dogData);
dogDataModule.dogList.add(dogModel);
}
}
});
//this request doesn't
dogDataModule.dogList.sync('read', DogCollection, {
success: function () {
alert("success ");
},
error: function () {
alert("failure ");
}
};
return dogDataModule;
});
Я попытался добавить URL-адрес непосредственно в параметры запроса синхронизации, например:
dogDataModule.dogList.sync('read', DogCollection, {
url: 'http://localhost:7001/SERVICES/dogs',
success: function () {
alert("success");
},
error: function () {
alert("failure "
};
});
Но все, что это делает, это изменяет ошибку на "Uncaught TypeError: Object function (){ return parent.apply(this, arguments); } не имеет метода 'trigger'".
Я также пытался добавить "SERVICES/" и "../SERVICES/" перед свойством url коллекции или указав полное и явное свойство URL (вплоть до http://), но ничего из этого работал тоже.
Может кто-нибудь помочь мне понять, почему я вижу эту ошибку?
1 ответ
Прежде всего, я не думаю, что есть какая-то причина, по которой вы можете позвонить dogList.sync
напрямую (вы можете использовать dogList.fetch
, вы, конечно, хотите, чтобы функции fetch
предлагает вам в дополнение к серверу вызова.
Теперь ваша ошибка связана с тем, что вы используете sync
неправильно. Второй аргумент предназначен для экземпляра коллекции, а не класса, как показано в fetch
код:
return this.sync('read', this, options);
Так что в вашем случае это будет:
dogDataModule.dogList.sync('read', dogDataModule.dogList
Бонус:
Ошибка Uncaught TypeError : Object function (){ return parent.apply(this, arguments); } has no method 'trigger
исходит из того, что Backbone пытается применить метод trigger
вашего класса вместо экземпляра. function (){ return parent.apply(this, arguments); }
Часть конструктор вашего класса, так что это дает вам подсказку о том, что происходит.