我有两页。其中一个是具有许多功能的仪表板。第二页是共享仪表板 - 第一页的简单版本。 仪表板包含数据库的视图(它可以包含许多其他信息,但这个问题)。您可以单击过滤器按钮,将打开模态窗口。因此,简易版的仪表板没有这种可能性。我想添加它,但我不想从仪表板的完整版本中复制+过去的代码,因为这部分的代码大约有两千行。我将添加一些原始代码示例:
DashboardView = SomeAnotherView.extend({
initialize: function() {...},
events: {...} // huge objects of jQuery events,
render: function () {...},
... // 2k lines of functions for events
});
如何在其他页面上使用此视图?我试图从这个视图中调用一个函数:
DashboardView.prototype.filterClicked(event);
但是在这种情况下,event.curentTarget为null(这个函数是必需的),我也尝试发送“this”来获取上下文,但它失败了。 Backbone.js是否有可能在没有任何大量复制/过去代码的情况下为2个以上的页面使用一个 View ?
答案 0 :(得分:1)
理想情况下,如果您拥有简单版本和完整版本的视图,那么您应该拥有一个"基本视图" (简单的一个)和完整版应扩展基本视图。
它看起来像:
var SimpleDashbard = Backbone.view.extend({});
var Dashboard = SimpleDashbard.extend({});
通过这种方式,仪表板可以访问SimpleDashbard
中的方法。
您的情况听起来像是需要在基本视图中使用扩展视图中的方法。这不是一个好主意。理想情况下,如果它是共享的,您应该将其移动到基本视图/将其提取到实用程序方法或服务中,当然这涉及重写此方法以便可重用
答案 1 :(得分:-1)
如果您拥有共享大量功能的视图,则可以考虑使用相同的View类型,但在实例化时将其打开到某些配置。例如:
var DashboardView = Backbone.View.extend({
initialize: function(options) {
this.allowFunctionX = (options && options.allowFunctionX);
this.allowFunctionY = (options && options.allowFunctionY);
},
// etc
functionX: function() {
if (!this.allowFunctionX) { return; }
// do the function...
},
functionY: function() {
if (!this.allowFunctionY) { return; }
// do the function...
},
});
然后在一页上:
var firstDashView = new DashboardView({allowFunctionX: true});
在另一页上:
var secondDashView = new DashboardView({allowFunctionY: true});
如果功能分歧太多,这可能变得不值得(并且可能有更好的配置方式而不是传入一长串布尔值!)。如果您的要求在两个页面上有很大不同,我觉得复制他们需要的代码并不是一个主要的罪。