Model view controller 提取主干集合时,显示加载条/微调器的最佳方式是什么?
你好 最近,我进入了主干/需求领域,开始学习一些非常酷的东西。我试图了解在获取主干集合时显示加载条/微调器的最佳实践是什么。以下是我发现用于触发集合上的获取/同步事件的一些策略: 方法1:在应用程序启动之前覆盖主干的同步方法,并在该集合上触发“同步”事件 方法2:在应用程序启动之前覆盖主干的获取方法,并在该集合上触发“获取”事件 方法3:定义集合时,重写fetch()方法并触发事件“fetching”,以便可以监视任何实例的获取 方法4:有些人建议使用事件聚合,以便当视图调用集合的fetch()时,该视图触发事件 以下是我的情况:Model view controller 提取主干集合时,显示加载条/微调器的最佳方式是什么?,model-view-controller,events,backbone.js,Model View Controller,Events,Backbone.js,你好 最近,我进入了主干/需求领域,开始学习一些非常酷的东西。我试图了解在获取主干集合时显示加载条/微调器的最佳实践是什么。以下是我发现用于触发集合上的获取/同步事件的一些策略: 方法1:在应用程序启动之前覆盖主干的同步方法,并在该集合上触发“同步”事件 方法2:在应用程序启动之前覆盖主干的获取方法,并在该集合上触发“获取”事件 方法3:定义集合时,重写fetch()方法并触发事件“fetching”,以便可以监视任何实例的获取 方法4:有些人建议使用事件聚合,以便当视图调用集合的fetch()
- 假设我有一个集合C
- 有两个视图V1和V2可以访问它
- V1可以在C上调用fetch,但V2不能
- 当C启动提取时,只有V2应该显示加载条,并在C上调用reset()时将其关闭
- 还可能有其他视图V3、V4等,在获取C时可能还需要在加载栏中显示这些视图
其他方法和选择也受到欢迎。你的建议和建议将是最好的资源。谢谢。在主干网的上下文中。查看,例如:
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');
}
现在,在视图元素上加载class.st
只需在任何需要的地方显示微调器,例如
.ajax-spinner { backgrund: url('...'); display: none; }
.st-loading .ajax-spinner { display: block; }
现在想想你的选择:
方法1:不要覆盖库。下一个在生产中编写代码的家伙会因此诅咒你
方法2:您最好触发集合上的自定义事件,不需要重写任何本机主干方法。同样,这种类型的黑客攻击只有在你不能想出好的解决方案时才会发生
方法3:我想你的想法是,每次加载某个内容时,你都想显示一个微调器?我会为你的用户感到抱歉
方法4:如果这发生在一个视图中,则不需要使用事件中心。最后,您可以触发集合上的自定义事件,父窗口小部件可以订阅它。另一个需要考虑的问题是,您很可能需要在不同类型的元素中显示微调器,并且需要为不同的视图传递引用或选择器。现在,如果您想要一个通用的解决方案,当然可以在应用程序范围内为您的微调器提供相同的类,但是如果有一天您想要删除它们,您将非常头疼。您最好将这些内容本地化到您的视图中
在主干驱动的大型应用程序中,我们也有类似的情况。为此,我们有一个扩展,它适用于需要显示微调器的视图。看起来有点像这样:
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);
在主干.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');
}
现在,在视图元素上加载class.st
只需在任何需要的地方显示微调器,例如
.ajax-spinner { backgrund: url('...'); display: none; }
.st-loading .ajax-spinner { display: block; }
现在想想你的选择:
方法1:不要覆盖库。下一个在生产中编写代码的家伙会因此诅咒你
方法2:您最好触发集合上的自定义事件,不需要重写任何本机主干方法。同样,这种类型的黑客攻击只有在你不能想出好的解决方案时才会发生
方法3:我想你的想法是,每次加载某个内容时,你都想显示一个微调器?我会为你的用户感到抱歉
方法4:如果这发生在一个视图中,则不需要使用事件中心。最后,您可以触发集合上的自定义事件,父窗口小部件可以订阅它。另一个需要考虑的问题是,您很可能需要在不同类型的元素中显示微调器,并且需要为不同的视图传递引用或选择器。现在,如果您想要一个通用的解决方案,当然可以在应用程序范围内为您的微调器提供相同的类,但是如果有一天您想要删除它们,您将非常头疼。您最好将这些内容本地化到您的视图中
在主干驱动的大型应用程序中,我们也有类似的情况。为此,我们有一个扩展,它适用于需要显示微调器的视图。看起来有点像这样:
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);
可能重复:可能重复:极好的解决方案。我会记住这一点。我已经在想我不应该覆盖这个库,但是因为这是我发现的最常见的解决方案,所以我修改了它。谢谢!很好的解决方案。我会记住这一点。我已经在想我不应该覆盖这个库,但是因为这是我发现的最常见的解决方案,所以我修改了它。谢谢!