【问题标题】:collection.fetch() works after the view.render()collection.fetch() 在 vi​​ew.render() 之后工作
【发布时间】:2013-12-18 10:24:40
【问题描述】:

您好,我正在寻找在 collection.fetch() 完成后对 SomeFunc() 进行异步调用的方法。像这样的:

this.collection.fetch(function(){
   console.log('Fetch is done so I'm going to render the view!');
})

为什么我想要它:

我有呈现一些集合的视图。我使用 fetch() 函数从 REST API 的服务器端获取此集合中的全部数据。在 fetch() 之后,我试图渲染视图。但是在渲染开始的时候 fetch() 仍然没有完成,所以视图是用空集合渲染的。 Backbone 的解决方法是什么?

感谢任何预付款。

【问题讨论】:

标签: backbone.js


【解决方案1】:

您可以通过使用 jQuery 的延迟对象来稍微整理一下:

http://api.jquery.com/deferred.then/

this.collection.fetch().then(this.done, this.fail);

// .. somewhere else ...

done : function () {
    console.log('yey');
},

fail : function () {
    console.log('ney');
}

顺便说一句,我知道您可以将事件用于类似目的,但如果您从表面上理解手册中所说的内容:

“请注意,在页面加载时,不应使用 fetch 来填充集合——加载时需要的所有模型都应该已经引导到位。fetch 旨在为不需要立即需要的接口延迟加载模型:例如, 包含可以打开和关闭的注释集合的文档。”

然后您可能最终会根据需要提取数据,可能是通过一个环绕并以我演示的方式调用 fetch 的方法。

【讨论】:

    【解决方案2】:

    我不同意使用 successerror 回调。他们至少没有利用Backbone.Collection 的用处。您需要尽可能使用主干事件!看看绑定到集合的“重置”事件,该事件在成功获取后触发。尝试在视图的 initialize 方法中执行类似的操作:

    initialize: function () {
      this.collection.bind('reset', this.render, this);
    },
    

    代码更少,更简洁,并且利用了库中可能最有用的部分:事件!

    【讨论】:

    • 非常感谢,好主意!
    • 请记住,除非您传入 reset: true (backbone 1.0),否则 reset 不会在 fetch 时触发。请参阅backbonejs.org 上的“升级到主干 1.0”说明
    • @Crungmungus 大喊大叫,在他弄清楚之前可能会让他困惑一段时间
    【解决方案3】:

    只需使用成功,错误回调:

    this.collection.fetch({
    success: function(){
       console.log("Fetch is done so I'm going to render the view!");
    },
    error: function() {...}
    })
    

    【讨论】:

    • 谢谢。这就是我想要的!
    • 可以通过使用 Promise this.collection.fetch().then(doSomething) 来解决这个问题
    • @Crungmungus - 好主意 :) +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    相关资源
    最近更新 更多