8
loadMore: function(){
    var $this = this;
    console.log(this.Messages); //SAME AS AFTER
    this.Messages.url = '/js/messages/?start=' + this.Messages.length
    this.Messages.fetch({'add':true,
        success:function(){
            console.log($this.Messages); //SAME AS BEFORE??
        },
        error:function(){
        }
    });
 },

集合未更新。在此函数之后,会触发事件,并在屏幕上绘制新项目。问题是该集合没有添加新模型。

4

4 回答 4

21

如前一个答案中所述,该add选项已在 1.0.0 中删除。你可以通过传递remove: false来完成同样的事情。从文档:

可以使用可用的 set 选项自定义 fetch 的行为。例如,要获取一个集合,为每个新模型获取一个“添加”事件,为每个更改的现有模型获取一个“更改”事件,而不删除任何内容:collection.fetch({remove: false})

于 2013-04-14T05:05:14.520 回答
0

在骨干网 1.0 中,您必须手动触发重置:

youColloection.fetch({reset: true});
于 2013-12-11T12:05:16.987 回答
0

Backbone 1.0 删除了这个特性,破坏了依赖于这个的代码:

http://backbonejs.org/#Collection-fetch

与之比较:

“如果您想将传入的模型添加到当前集合中,而不是替换集合的内容,请将 {add: true} 作为获取的选项传递。”

http://htmlpreview.github.com/?https://raw.github.com/documentcloud/backbone/0.9.2/index.html#Collection-fetch

我建议在修复此问题之前恢复到旧版本的 Backbone。

于 2013-04-02T03:35:26.300 回答
0

Backbone.Collection.fetch():

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

所以这里的情况是,您传入的函数被分配给var succees.
collection[method](resp, options);被调用,在你的情况下方法是'reset'.
collection.reset必须通过并添加所有模型,在途中触发所有事件。我不知道到底发生了什么,但它经历了collection.reset, collection.add, model.add, 等等……我没有完全按照。

我不确定到底是什么问题,对此我很抱歉。我希望我至少可以帮助您尝试一些事情,这样也许我们可以弄清楚。该行if (success) success(collection, resp, options)是对您的 succes 函数的调用。您可能会尝试做的是让您的成功回调接受传回的参数并对其进行一些安慰:

success: function(collection, resp, options) {
  console.log(collection); // this might do the trick.

  // if not, you could try the following
  collection.on("reset", function(c, options) {
    console.log(c); // see what that gives ya.
  });
}

另一件事是,我在源代码或文档中找不到 collection.fetch 采用添加选项的任何地方。如果我错过了,请告诉我我想看一下。

祝你好运,让我知道你发现了什么。也可能值得通过调试器逐步完成。

妈的,我也很震惊,控制台经常向我展示不应该展示的最新版本的集合对象。

尝试安慰集合的长度,而不是什么:

var len = $this.Messages.length;
console.log(len);


//...
// or in the success callback
var len = collection.length;
console.log(len);
于 2013-03-09T11:38:36.150 回答