在第一次加载时渲染模型的视图,而不是在每次更改时

时间:2012-08-20 13:00:47

标签: backbone.js backbone-events backbone-views

我想在第一次提取模型时渲染模型的视图,但不是每次更改时都是如此。

我的设置如下:

var m = new $.model.Customer({id: customer});
var v = new $.view.GeneralEditView({el: $("#general"), model: m});
m.fetch();

然后在视图初始化中,我将change事件绑定到render方法,以便在加载模型时进行渲染:

this.model.bind('change', this.render);

问题是视图会在每次更改时呈现。我想只在获取后渲染。不幸的是,我不知道在获取除变更之外的模型之后发生的任何事件。

对于我可以绑定的集合,是否存在类似'reset'的内容?

编辑:

也许更简洁地说,对于Backbone模型,有没有办法区分何时从服务器加载模型而不是在本地更改?

3 个答案:

答案 0 :(得分:1)

<强>模型

您可以使特定于某个键的change事件发生变化,例如uniqueId(如果您有):

this.model.bind('change:id', this.render, this);

默认情况下,fetch不会直接触发任何事件,但会在使用change

加载新数据后间接触发set事件

如果这不是一个选项,您始终可以在fetch功能中触发事件:

initialize: function () {
    this.model.bind("fetch", this.update, this);
}

fetch: function () {
    // do stuff
    this.model.trigger("fetch", this);
}

update: function () {
    // your refresh stuff here
}

答案 1 :(得分:1)

有很多不同的方法可以解决这个问题(这些方法都假定var view = this;在视图代码中的某处):

  • 使用一次性成功回调呼叫.fetch()

    m.fetch({
        success: function() {
            view.render();
        }
    });
    
  • 绑定到change但在解析器中取消绑定:

    function handle() {
        view.render();
        view.model.off('change', handle);
    }
    this.model.bind('change', handle);
    
  • 使用_.once限制处理程序调用:

    this.model.bind('change', _.once(function() {
        view.render();
    }));
    
  • 为模型使用.ready()模式 - example here。我喜欢这个选项,如果多个视图需要知道何时加载模型,以及何时需要能够编写相同的代码而不必担心模型是否已加载。这样做的缺点是它需要你添加一个像.isFullyLoaded()这样的模型方法来测试每次;好处是使用测试功能,而不是设置标志,允许模型作为集合的一部分批量加载,而无需更改代码。

答案 2 :(得分:0)

我可能有https://github.com/documentcloud/backbone/pull/1468#issuecomment-6766096的一般解决方案。我在Backbone上覆盖了同步方法,如下所示:

Backbone.Model.prototype.sync = function(method, model, options) {

    var succ = options.success;
    var customSuccess = function(resp, status, xhr) {
         //call original
        succ(resp, status, xhr);
        model.trigger('synced', model, options);
    }
    options.success = customSuccess;
    Backbone.sync(method, model, options);
 }

要保存原始成功方法,因为除非我需要,否则不要弄乱它,传递自定义成功方法。调用自定义成功方法时,将按照@Austin的建议触发自定义事件,然后调用原始成功方法。