在 Backbone.View 的上下文中,例如:
initialize: function() {
this.state_loading();
// assuming this.collection is your collection which is not fetched yet...
this.collection.bind('reset', this.state_loaded, this);
this.collection.fetch();
},
state_loading: function() {
this.el.addClass('st-loading');
},
state_loaded: function() {
this.el.removeClass('st-loading');
}
现在.st-loading
View 元素上的类将在您需要的任何地方简单地显示一个微调器,例如
.ajax-spinner { backgrund: url('...'); display: none; }
.st-loading .ajax-spinner { display: block; }
现在想想你的选择:
方法 1:不要覆盖库。下一个在生产中处理您的代码的人会因此而诅咒您。
方法 2:最好在集合上触发自定义事件,不需要覆盖任何本机 Backbone 方法。同样,只有当您无法提出好的解决方案时,才会进行这种类型的黑客攻击。
方法 3:我猜您的想法是每次加载某些内容时您都想显示一个微调器?我会为你的用户感到难过。
方法 4:如果这发生在一个视图中,则不需要使用事件中心。最后,您可以在集合上触发自定义事件,并且父小部件可以订阅它。另一个考虑因素是您很可能需要在不同类型的元素中显示微调器,并且您需要为它们传递引用或选择器以用于不同的视图。现在如果你想要一个通用的解决方案,当然你可以给你的微调器提供相同的类应用程序,但是如果有一天你想删除它们,你会很头疼。您最好将这些内容本地化到您的视图中。
我们在一个由 Backbone 驱动的大型应用程序中遇到了类似的情况。为此,我们有一个扩展,我们将其应用于需要显示微调器的视图。它看起来有点像这样:
var state_loading: function() {
if (arguments.length === 0 || arguments[0] === true) {
this.el.addClass('st-loading');
} else {
this.el.removeClass('st-loading');
}
}
var SomeView = Backbone.View.extend({
initialize: function(options) {
this.options = _.extend({}, this.options || {}, options || {});
this.collection = this.options.collection;
this.collection.bind('reset', this.render, this);
this.state_loading(true);
this.collection.fetch();
},
render: function() {
this.state_loading(false);
// your code...
}
});
_.extend(SomeView.prototype, state_loading);