我目前正在研究一个项目的框架,我们将其拆分为Web客户端和服务器代码。 客户端代码使用require .js和backbone.js的组合。 我目前正在设置客户端/服务器通信,理想情况下我们希望能够使用骨干内置的.sync功能(以及基于它的fetch调用)。
然而,我遇到了一系列奇怪的错误。
代码执行时,我在控制台中收到以下错误。 “未捕获错误:必须指定”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);没有方法'触发'“。
我还尝试在集合的url属性前添加“SERVICES /”和“../SERVICES/”,或者提供完整和显式的URL属性(最多包括http://),但是这些都没有奏效。
任何人都可以帮我弄清楚为什么我会看到这个错误吗?
答案 0 :(得分:2)
首先,我不认为您有任何理由直接致电dogList.sync
(您可以使用dogList.fetch
,您当然需要这些功能{{1}除了服务器调用之外,它还为您提供。
现在,您的错误来自于您错误地使用fetch
这一事实。第二个参数旨在成为集合的实例,而不是类,如sync
的代码所示:
fetch
所以在你的情况下,那就是:
return this.sync('read', this, options);
加成:
错误dogDataModule.dogList.sync('read', dogDataModule.dogList
来自Backbone尝试应用您的类的Uncaught TypeError : Object function (){ return parent.apply(this, arguments); } has no method 'trigger
方法而不是实例的事实。 trigger
部分是您班级的构造函数,因此可以提示您发生了什么。