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;
}