1

这是我的情况:我使用 jQuery.Forms 在提交表单时进行 ajax 调用。当 ajax 调用开始并返回时,我需要各种模型/视图来响应这些事件(模型使用从调用返回的数据进行更新,某些控件被禁用然后启用等等)。

我在视图中映射了表单。我如何才能从视图中触发自定义“formSubmitting”“formSubmitted (with data)”并让任意数量的模型/视图响应这些事件?使用 Backbone.js 执行此操作的最惯用方式是什么?

编辑:

这就是我想要做的:

    window.UploaderView = Backbone.View.extend({
        initialize: function() {
            this.setElement(this.options.base_div);
            this.$el.find('form').ajaxForm({
                beforeSubmit: function() {
                    this.trigger('ajax-calling');
                },
                success: function(responseJSON) {
                    this.trigger('ajax-called', responseJSON);
                },
                dataType: 'json,'
            });
        },
    });

    var update_uploader = new window.UploaderView({
        base_div: $('#update-upload-action'),
    });

    var trigged = new window.UploaderView({
        parent_view: update_uploader,
        initialize: function() {
            this.options.parent_view.on('ajax-calling', function() {
                alert('calling!');
            });
        },
    });    

但这不起作用(不显示警报消息)。

谢谢

4

2 回答 2

1

AJAX 响应超出了视图的范围,因此“this”不属于视图。将响应移动到视图并应​​用 _.bindAll(this); 解决您的问题。

window.UploaderView = Backbone.View.extend({
    initialize: function() {
        _.bindAll(this);
        this.setElement(this.options.base_div);
        this.$el.find('form').ajaxForm({
            beforeSubmit: this.onBeforeSubmit,
            success: this.onSuccess,
            dataType: 'json,'
        });
    },
    onBeforeSubmit : function() {
        this.trigger('ajax-calling');
    },
    onSuccess: function(responseJSON) {
        this.trigger('ajax-called', responseJSON);
    }
});

var update_uploader = new window.UploaderView({
    base_div: $('#update-upload-action'),
});

var trigged = new window.UploaderView({
    initialize: function() {
        this.options.parent_view.on('ajax-calling', function() {
            alert('calling!');
        });
    },
}); 
于 2012-10-10T15:21:00.540 回答
1

当您创建新实例时,您的initialize函数永远不会执行window.UploaderView,而是放置在视图的选项中(请参阅 Backbone.js视图构造文档)。

您需要的是一个事件总线,从Backbone.Events您的所有视图/模型继承并可用于所有视图/模型的单个对象:

var eventBus = _.clone(Backbone.Events);

window.UploaderView = Backbone.View.extend({
    initialize: function() {
        this.setElement(this.options.base_div);
        this.$el.find('form').ajaxForm({
            beforeSubmit: function() {
                eventBus.trigger('ajax-calling');
            },
            success: function(responseJSON) {
                eventBus.trigger('ajax-called', responseJSON);
            },
            dataType: 'json,'
        });
    },
});

window.AnotherView = Backbone.View.extend({
    initialize: function() {
        eventBus.on('ajax-calling', this.ajaxCallingHandler);
    },
});

window.AnotherModel = Backbone.Model.extend({
    initialize: function() {
    eventBus.on('ajax-called', this.ajaxCallingHandler);
    },  
});

PS 另请注意,示例中的 ajaxFormsuccessbeforeSubmit处理程序是在 ajax 设置对象的范围内执行的。因此,您不能只this.trigger()在其中使用它们,而必须将这些函数绑定到window.UploaderViewwith_.bind()或使用闭包。更多关于范围绑定

于 2012-10-10T14:01:42.170 回答