Backbone.js从中提取集合's初始化方法

Backbone.js fetch collection from it's initialize method

本文关键字:初始化 方法 集合 js 提取 Backbone      更新时间:2023-09-26

有人为我们构建了一个应用程序,向我提供了代码,以便我可以浏览它,我注意到了这一点,一开始似乎还可以,甚至让集合管理他的数据也很好但过了一段时间,我开始思考这个想法可能存在的陷阱

因此:从集合自己的initialize方法中获取集合的数据是一种好的做法吗。

例如:

var Book = Backbone.Model.extend({});
var Books = Backbone.Collection.extend({
    url: '/books',
    initialize: function(){
        // do some logic here
        // if collection is empty, fetch from server
        if(this.size() == 0)
            this.fetch();
    }
});

我问这个问题是因为我觉得在以下情况下可能会有问题:

假设我们在一条路线上行动:

books: function() {
    var books = new Books();
    var bookList = new BookList({ collection: books });
}

这种情况难道不可能失败吗?如果获取比视图的初始化更快,视图会绑定到重置事件,重置会在执行视图初始化之前触发吗?

我错了吗,还是应该提交一张票来解决这个问题。

虽然在实践中,视图的初始化很可能会在fetch()完成之前发生(并且您会将render()绑定到reset而不是initialize()),但无论如何,依赖异步操作的顺序都是一个非常糟糕的主意。换句话说,您的代码应该以一种与顺序无关的方式编写。

我见过fetch()在各种项目中被initialize()调用。我仍然认为这是不可取和不好的做法。需要时显式提取也有以下优点:

  1. 你可以在需要的时候做,而不是每次创建新的收藏
  2. 如果你想,你可以按顺序做某些事情:

    例如,只能在提取后初始化视图并进行渲染。

    var bookList, books = new Books();
    var p = books.fetch();
    p.done(function () {
      bookList = new BookList({collection: books });
      bookList.render();
    });
    
  3. 它使测试更容易。