Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
Backbone.js 在第一次加载时为模型渲染视图,而不是每次更改时_Backbone.js_Backbone Events_Backbone Views - Fatal编程技术网

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

Backbone.js 在第一次加载时为模型渲染视图,而不是每次更改时,backbone.js,backbone-events,backbone-views,Backbone.js,Backbone Events,Backbone Views,我希望在第一次获取模型时为模型渲染视图,但不是在每次更改时 我的设置如下: var m = new $.model.Customer({id: customer}); var v = new $.view.GeneralEditView({el: $("#general"), model: m}); m.fetch(); Backbone.Model.prototype.sync = function(method, model, options) { var succ = opti

我希望在第一次获取模型时为模型渲染视图,但不是在每次更改时

我的设置如下:

var m = new $.model.Customer({id: customer});
var v = new $.view.GeneralEditView({el: $("#general"), model: m});
m.fetch();
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);
 }
然后在视图初始化中,我将更改事件绑定到渲染方法,以便在加载模型时进行渲染:

this.model.bind('change', this.render);
问题是每次更改后都会呈现视图。我只想在取回后渲染。不幸的是,除了更改之外,我没有发现在获取模型之后触发的任何事件

是否有类似于“重置”的集合可以绑定到

编辑:


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

模型

您可以使
change
事件特定于某个键的更改,例如uniqueId(如果有):

默认情况下,
fetch
不会直接触发任何事件,而是在使用
set
加载新数据后间接触发
change
事件

如果这不是一个选项,则始终可以在
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
}

我可能有一个通用的解决方案。我在主干上重写了sync方法,如下所示:

var m = new $.model.Customer({id: customer});
var v = new $.view.GeneralEditView({el: $("#general"), model: m});
m.fetch();
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的建议触发自定义事件,然后调用中的原始成功方法。

有许多不同的方法来实现这一点(这些方法都假定
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);
    
  • 使用
    \一次
    来限制处理程序调用:

    this.model.bind('change', _.once(function() {
        view.render();
    }));
    
  • 为您的型号使用
    .ready()
    模式-。我喜欢在多个视图需要知道模型何时加载的情况下使用此选项,并且您需要能够编写相同的代码,而不必担心模型是否已加载。这样做的缺点是,它需要您添加一个模型方法,如
    .isFullyLoaded()
    ,以便每次都进行测试;好处是,使用测试函数而不是设置标志,可以将模型作为集合的一部分批量加载,而无需更改代码


谢谢奥斯汀。问题在于模型而不是集合。我知道集合的重置,并且正在为模型寻找类似的东西,或者寻找除更改以外的其他方法。然后,第二节详细介绍如何使用模型执行此操作,应该适合您的需要…但我真的想知道提取何时完成,而不是开始,因为我希望在获取完成时呈现视图。然后将
this.model.trigger
放在AJAX调用的回调中。我希望听到是否有人能够预见这种方法的问题。我只是有点不确定这一切会对“这个”的范围产生怎样的影响……我认为这是唯一可靠的方法。使用新同步事件的方法不能保证在同步完成后正确填充模型,因此会导致问题。选择了“关闭”方法。谢谢