在model.fetch完成时触发事件的最佳方法

时间:2012-06-27 22:23:34

标签: backbone.js backbone-events marionette

我正在寻找获取完成时触发事件的最佳方式 这段代码有效,但我很想知道是否有更好的方法来完成以下任务。

var myApp = new Marionette.Application();

myApp.on("initialize:before", function () {
    this.currentUser = new UserModel();
    this.currentUser.fetch({
        complete: function () {
            myApp.vent.trigger('currentUser');
        }
    });
});

1 个答案:

答案 0 :(得分:3)

成功fetch triggers a "change" event

  

抓取 model.fetch([options])

     

[...]如果服务器的状态与当前属性不同,将触发"change"事件。

因此,如果fetch执行任何操作,您将可以收听"change"

myApp.on("initialize:before", function () {
    this.currentUser = new UserModel();
    this.currentUser.on('change', function() {
        myApp.vent.trigger('currentUser');
    });
    this.currentUser.fetch();
});

如果以某种其他方式更改"currentUser"并且可能会或可能不是您想要的,那么这也会触发this.currentUser事件。如果你只想让你的函数调用一次,那么你当前的success处理程序可能是最简单的事情;你仍然可以使用on并在调用它时取消绑定处理程序:

myApp.on("initialize:before", function () {
    var triggerCurrentUser = _.bind(function() {
        myApp.vent.trigger('currentUser');
        this.currentUser.off('change', triggerCurrentUser);
    }, this);

    this.currentUser = new UserModel();
    this.currentUser.on('change', triggerCurrentUser);
    this.currentUser.fetch();
});

您也可以使用_.once,但这样会留下无操作回调函数,并且不需要这样做。