Backbone.js集合在获取操作后不会调用"重置"事件

Dee*_*ons 7 javascript ajax events backbone.js underscore.js

请求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"
}]
Run Code Online (Sandbox Code Playgroud)

集合不会调用"重置"事件,因为文档说它应该.我可以在获取方法后查看请求和响应是否正确但没有任何反应.以下是我的应用程序的代码.启动一切的路由器

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();
Run Code Online (Sandbox Code Playgroud)

收藏

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

查看订阅重置事件的视图

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")
    }
})
Run Code Online (Sandbox Code Playgroud)

参考站点

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

Rak*_*mer 19

你应该通过在从Backbone 1.0获取时传递{reset:true}来告诉Backbone在fetch上触发重置

替换:

Theater.movies.fetch()
Run Code Online (Sandbox Code Playgroud)

Theater.movies.fetch({reset :true})
Run Code Online (Sandbox Code Playgroud)

  • 它似乎使代码更具可读性和可理解性,您可以轻松地看到您希望集合在获取时执行某些操作.另一个原因可能是出于效率原因降低被解雇事件的数量.这只是我无法在网上找到相关文档的假设. (3认同)

dvt*_*ver 2

我也遇到了类似的问题,希望我的回答对其他人有用。起初我的data.json文件无效。后来发现我忽略了下面这行代码:

Theater.Models.Movie = Backbone.Model.extend({}
Run Code Online (Sandbox Code Playgroud)

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