Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Backbone.js从它获取集合';s初始化方法_Javascript_Backbone.js - Fatal编程技术网

Javascript Backbone.js从它获取集合';s初始化方法

Javascript Backbone.js从它获取集合';s初始化方法,javascript,backbone.js,Javascript,Backbone.js,有人为我们开发了一个应用程序,向我提供了代码,我可以浏览它, 我注意到了这一点,一开始似乎还可以,甚至可以让集合管理他的数据 但过了一会儿,我开始思考这个想法中可能存在的陷阱 因此: 从集合自己的initialize方法获取集合的数据是否是一种好的做法 例如: var Book = Backbone.Model.extend({}); var Books = Backbone.Collection.extend({ url: '/books', initialize: fu

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

因此: 从集合自己的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()
)无论如何,依赖异步操作的顺序是一个非常糟糕的主意。换句话说,您的代码应该以与顺序无关的方式编写

我看到在各种项目中,
initialize()
调用了
fetch()
。我仍然认为这是不可取的和不好的做法。在需要时显式获取还具有以下优点:

  • 您可以在需要时执行此操作,而不是每次创建新集合时
  • 如果您想:

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

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


  • 感谢您的洞察力,我将要求他相应地编辑代码。在几点上你是对的,尽管我相信在他的情况下,当前应用程序只创建了一个集合,所以每次创建集合时加载并不是一个真正的问题,尽管我可以看到,当应用程序明年晚些时候进入2或3版时,它会成为一个问题,可能会添加其他集合。正如你在问题中暗示的那样,这是一个使用正确方法的问题。在
    initialize
    内部提取不会产生错误。这是无效的,丑陋的,原则上是错误的。@mu太短了,谢谢!我花了20分钟试图找出列表中的代码块,但失败了。我想念我的休息…我在SyncPanel组件中这样做。例如panel.load({tasks:{fetch:[books]},sync:function-doSomeThingWithBooks(){…})。这样处理并行调用和错误就容易多了。。。