Javascript RequireJS和主干ajax问题
Javascript RequireJS和主干ajax问题,javascript,jquery,backbone.js,requirejs,Javascript,Jquery,Backbone.js,Requirejs,我不熟悉RequireJS和主干网,并且试图理解为什么ajax(fetch)代码不能正常工作 main.js AppView.js AppCollections.js 应用模型 问题是:一旦获取集合,就不会调用render方法。开发工具中也没有错误。所以我不知道该去哪里找 任何指针都是有用的 谢谢 病毒性当您覆盖主干中的同步方法时,它将无法正确触发事件。试一试 或者,您可以简单地使成功函数看起来像主干源: success = function(resp) { if (success)
我不熟悉RequireJS和主干网,并且试图理解为什么ajax(fetch)代码不能正常工作 main.js AppView.js AppCollections.js 应用模型 问题是:一旦获取集合,就不会调用render方法。开发工具中也没有错误。所以我不知道该去哪里找 任何指针都是有用的 谢谢
病毒性当您覆盖主干中的同步方法时,它将无法正确触发事件。试一试 或者,您可以简单地使成功函数看起来像主干源:
success = function(resp) {
if (success) success(model, resp, options);
model.trigger('sync', model, resp, options);
};
未调用成功回调,因为
sync
方法未将其传递给ajax
sync
的第三个参数是options对象,其中包含成功回调
sync: function (method, model, options) {
var $this = this;
var success = options.success;
options.success = function(resp) {
if (success) success(model, resp, options);
model.trigger('sync', model, resp, options);
};
var params = _.extend({
type: 'GET',
dataType: 'jsonp',
url: $this.url,
processData: false
}, options);
return $.ajax(params);
}
这样,ajax
将正确调用主干集合的fetch
中定义的成功回调,该回调将依次调用传递到fetch中的成功回调
然后获取:
this.collection.fetch({
success: function() {
$this.render();
}
});
这里是从中获取。您可以看到它将success
回调传递到sync
fetch: function(options) {
options = options ? _.clone(options) : {};
if (options.parse === void 0) options.parse = true;
var success = options.success;
options.success = function(collection, resp, options) {
var method = options.update ? 'update' : 'reset';
collection[method](resp, options);
if (success) success(collection, resp, options);
};
return this.sync('read', this, options);
},
回答很好,Paul,但我只想指出以下几点:
当试图通过重写fetch的success函数从ajax调用中检索数据时,我必须对代码进行以下修改:
sync: function (method, model, options) {
var $this = this;
var success = options.success;
options.success = function(resp) {
if (success) success(resp);
model.trigger('sync', model, resp, options);
};
var params = _.extend({
type: 'GET',
dataType: 'jsonp',
url: $this.url,
processData: false
}, options);
return $.ajax(params);
}
请注意行中的差异:
if (success) success(resp);
这是必要的,以便正确地将响应传递给success函数,否则它将被模型覆盖。现在,在fetch的success功能中,您可以输出数据:
var $this = this;
this.collection.fetch({
success: function(collection, response, options){
$this.render(response);
}
});
这会将ajax数据(响应)传递给渲染函数,以执行您喜欢的操作。当然,您也可以事先以任何方式操作数据
理想情况下,我希望能够将数据传递到collection.models对象,就像主干默认情况下那样。我相信这与数据的解析方式有关,但我还没有弄清楚。如果有人有解决办法,我很想听听:)
更新:
我已经设法重写了parse函数,并以这样的方式处理来自ajax调用的JSON数据,以便保持主干结构其集合对象的真实方式。代码如下:
parse: function(resp){
var _resp = {};
_resp.results = [];
_.each(resp, function(model) {
_resp.results.push(model);
});
return _resp.results;
}
这将创建一个新对象,其中包含一个名为results的模型数组,然后返回到fetch函数,允许您直接访问每个模型的属性。是的,当我尝试添加选项作为第三个参数时,它给了我以下错误:-->Uncaught TypeError:Object#没有方法“reset”backbone.js:816 u.extend.fetch.options.success backbone.js:816 jQuery.Callbacks.fire jQuery.js:1037 jQuery.Callbacks.self.fireWith jQuery.js:1148完成jquery.js:8074 jquery.ajaxTransport.send.script.onload.script.onreadystatechangeYeah..调试代码时..我发现传递到获取函数的选项未定义..不确定是否需要显式传递选项。成功?好的,您会遇到此错误,因为ajax
期望使用不同参数成功回调,因此,您可以在主干sync
中看到它在做什么,并将其添加到上面的代码中。嗯……非常感谢您解决了我的问题……我将阅读更多有关同步和获取文档的内容……以了解流程……是的,很难理解ajax
调用sync
中定义的success
回调,然后该回调调用fetch
中定义的回调,该回调最终调用传递到fetch中的回调。通常情况下,如果你不重写fetch或sync,你就不必担心这个问题。谢谢ryan。你的答案也是正确的。但是不确定。把代码放在哪里。还有为什么…Paul提供了…解释,所以接受了他的答案。他的答案比我的好得多!我不配赢。
sync: function (method, model, options) {
var $this = this;
var success = options.success;
options.success = function(resp) {
if (success) success(resp);
model.trigger('sync', model, resp, options);
};
var params = _.extend({
type: 'GET',
dataType: 'jsonp',
url: $this.url,
processData: false
}, options);
return $.ajax(params);
}
if (success) success(resp);
var $this = this;
this.collection.fetch({
success: function(collection, response, options){
$this.render(response);
}
});
parse: function(resp){
var _resp = {};
_resp.results = [];
_.each(resp, function(model) {
_resp.results.push(model);
});
return _resp.results;
}