Backbone.js等到渲染之前回调

时间:2012-01-26 19:59:43

标签: javascript backbone.js underscore.js

在下面的代码块中,我需要确保initialize1initialize2remoteAPIObj的调用都已完成,然后再渲染我的视图。这两个函数都在执行AJAX查询并执行给定的回调函数。

所以我定义了另一个函数renderOnce并使用了underscore.js函数after来确保在实际执行之前实际调用了renderOnce 2次。这种方法有什么缺失吗?或者您还有其他建议吗?

window.MyView = Backbone.View.extend({
    el: $('#right-container'),
    render: function(eventName) {
        var template = Handlebars.compile($("#right-template").html());
        $(this.el).html(template(remoteAPIObj.getData()));

        return this;
    },
    initialize: _.once(function() {
        var self = this;
        remoteAPIObj.initialize1(function(){self.renderOnce();});
        remoteAPIObj.initialize2(function(){self.renderOnce();});
    }),
    renderOnce: _.after(2, function() {
        this.render();
    })
});

1 个答案:

答案 0 :(得分:1)

使用jQuery承诺方法执行此操作的理想方法 - http://api.jquery.com/jQuery.when/

示例:

$.when( $.ajax("test.aspx") ).then(function(ajaxArgs){ 
     alert(ajaxArgs[1]); /* ajaxArgs is [ "success", statusText, jqXHR ] */
});

如果你的内部代码可以适应承诺,你可以做这样的事情

$.when(remoteAPIObj.initialize1, remoteAPIObj.initialize2).then(function(args1, args2){
    this.render();
});

如果失败,您还可以使用事件系统触发事件,该事件通知render方法数据可用。但这与你正在做的事情并没有太大的不同。