【问题标题】:Backbone.js Collections do not invoke "Reset" event after fetch operationBackbone.js 集合在获取操作后不会调用“重置”事件
【发布时间】:2012-02-22 04:28:57
【问题描述】:

当请求data.json 文件以填充具有以下数据的集合时

[{
    "Id": "BVwi1",
    "Name": "Bag It",
    "AverageRating": 4.6,
    "ReleaseYear": 2010,
    "Url": "http://www.netflix.com/Movie/Bag_It/70153545",
    "Rating": "NR"
}, {
    "Id": "BW1Ss",
    "Name": "Lost Boy: The Next Chapter",
    "AverageRating": 4.6,
    "ReleaseYear": 2009,
    "Url": "http://www.netflix.com/Movie/Lost_Boy_The_Next_Chapter/70171826",
    "Rating": "NR"
}]

Collection 不会像文档中所说的那样调用“Reset”事件。我可以在 fetch 方法之后查看请求和响应是否正确,但没有任何反应。下面是我的应用程序的代码。 路由器启动就是一切

Theater.Router = Backbone.Router.extend({
    routes: {
        "": "defaultRoute"
    },

    defaultRoute: function () {
        Theater.movies = new Theater.Collections.Movies()
        new Theater.Views.Movies({
            collection: Theater.movies
        });
        Theater.movies.fetch();
    }
})
var appRouter = new Theater.Router();
Backbone.history.start();

收藏

Theater.Collections.Movies = Backbone.Collection.extend({
    model: Theater.Models.Movie,
    url: "scripts/data/data.json",
    initialize: function () {}
});

订阅重置事件的视图

Theater.Views.Movies = Backbone.View.extend({
    initialize: function () {
        _.bindAll(this, "render", "addOne");
        this.collection.bind("reset", this.render);
        this.collection.bind("add", this.addOne);
    },

    render: function(){
        console.log("render")
        console.log(this.collection.length);
    },

    addOne: function (model) {
        console.log("addOne")
    }
})

参考网站

http://bardevblog.wordpress.com/2012/01/16/understanding-backbone-js-simple-example/

【问题讨论】:

  • 您在哪里收听活动?我期待this.collection.bind("reset", this.render); 或类似的地方
  • 集合是否被填充,但没有触发“重置”事件?还是根本没有人居住?你还没有说你是如何监听事件或如何检查集合内容的。
  • @JayC 我不能改变所有这些代码的问题,因此我包含了链接。这与我在这里尝试的完全相同。 Theatre.View.Movies 查看重置事件的订阅者。
  • @nrabinowitz 集合没有被填充,即使 json 文件包含数据。我正在收听 View 中呈现 Collection 的事件
  • @PaulD.Waite 是的,页面是服务器,我可以看到所有请求和控制台消息,除了集合被重置。我正在尝试参考站点中提供的完全相同的东西。

标签: javascript ajax events backbone.js underscore.js


【解决方案1】:

从 Backbone 1.0 开始,您应该通过传递 {reset: true} 来告诉 Backbone 在获取时触发重置

替换:

Theater.movies.fetch()

Theater.movies.fetch({reset :true})

【讨论】:

  • 知道为什么会这样吗?
  • 这似乎使代码更具可读性和可理解性,您可以轻松地看到您期望集合在获取时执行某些操作。另一个原因可能是出于效率原因而降低触发事件的数量。这只是我在网上找不到相关文档的假设。
【解决方案2】:

我也遇到过类似的问题,希望我的回复对大家有用。起初我的data.json 文件无效。然后原来我忽略了下面这行代码:

Theater.Models.Movie = Backbone.Model.extend({}

添加这行代码为我解决了这个问题。

【讨论】:

    【解决方案3】:

    如果未填充集合,您的提取可能会出现问题。请参阅 this answer 了解如何将错误处理程序传递到 fetch 操作中。

    【讨论】:

    • 整个代码没有问题,因为 IIS 搞砸了一些东西。我尝试使用来自 twitter json 服务的实时提要,效果很棒
    【解决方案4】:

    我有同样的 iusse.. 并通过以下方式修复它:

    youColloection.fetch({reset: true});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 2012-06-07
      • 2011-11-30
      • 2012-07-08
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      相关资源
      最近更新 更多