2页或更多页面的一个视图(backbone.js)

时间:2017-08-22 18:39:49

标签: javascript backbone.js

我有两页。其中一个是具有许多功能的仪表板。第二页是共享仪表板 - 第一页的简单版本。 仪表板包含数据库的视图(它可以包含许多其他信息,但这个问题)。您可以单击过滤器按钮,将打开模态窗口。因此,简易版的仪表板没有这种可能性。我想添加它,但我不想从仪表板的完整版本中复制+过去的代码,因为这部分的代码大约有两千行。我将添加一些原始代码示例:

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

2 个答案:

答案 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});

如果功能分歧太多,这可能变得不值得(并且可能有更好的配置方式而不是传入一长串布尔值!)。如果您的要求在两个页面上有很大不同,我觉得复制他们需要的代码并不是一个主要的罪。