0

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

我的设置如下:

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

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

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

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

对于我可以绑定的集合,是否有类似“重置”的东西?

编辑:

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

4

3 回答 3

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
}
于 2012-08-20T13:07:22.927 回答
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()模式 -示例在这里。在多个视图需要知道模型何时加载的情况下,以及当您需要能够编写相同的代码而不用担心您的模型是否已加载的情况下,我喜欢这个选项。这样做的缺点是它需要您添加一个模型方法,例如.isFullyLoaded()每次都进行测试;好处是使用测试函数而不是设置标志,允许模型作为集合的一部分批量加载,而无需更改代码。

于 2012-08-20T17:38:55.257 回答
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 的建议触发自定义事件,然后调用原始成功方法。

于 2012-08-20T14:50:17.293 回答