Backbone.js 使用来自多个不同主干/需求视图的同一对象实例

Backbone.js 使用来自多个不同主干/需求视图的同一对象实例,backbone.js,requirejs,Backbone.js,Requirejs,我尝试编写两个视图login view和register view,每个视图使用从两个视图中的keyupdom事件收集的相同数据进行渲染。登录模板的数据字段比注册模板少,所以模板变量也比注册模板少 所以我考虑使用一个模型来呈现这两个表单数据模型的gui。我试图将关注点分开,并对我的模块保持单一责任。现在,需要使表单数据模型成为一个视图的依赖项,并在此视图中创建,并通过使前一个视图成为另一个视图的依赖项,从另一个视图中提到同一个实例。然而,最后一个应该使用它作为依赖项的视图的相同实例。似乎只有一个

我尝试编写两个视图login view和register view,每个视图使用从两个视图中的keyupdom事件收集的相同数据进行渲染。登录模板的数据字段比注册模板少,所以模板变量也比注册模板少

所以我考虑使用一个模型来呈现这两个表单数据模型的gui。我试图将关注点分开,并对我的模块保持单一责任。现在,需要使表单数据模型成为一个视图的依赖项,并在此视图中创建,并通过使前一个视图成为另一个视图的依赖项,从另一个视图中提到同一个实例。然而,最后一个应该使用它作为依赖项的视图的相同实例。似乎只有一个视图和三个单独的模型表单数据、登录和注册以及两个不同的模板可以成为一个解决方案

这似乎令人惊讶。在面向对象的范例中,它感觉添加了一点特性使得它的速度非常麻烦,这和面向对象的思想相冲突。当用户单击登录视图中的“注册”按钮时,注册视图将显示刚输入的数据,反之亦然

使用一个视图/模型来引用另一个视图/模型来使用其模型等,是对主干的错误使用,或者是要求使用良好的开发实践,例如关注点分离、单一责任和模块化分离,或者对于那些良好的开发实践来说,这一点也不坏?

我认为让
View1
依赖
View2
这样
View1
就可以访问
View2
创建的
模型。。。但我确实认为这是次优的。我可以想出另外两个你想考虑的策略,让你避免让<代码> VIEW1依赖于<代码> VIEW2
首先,您可以选择不在
View2
中创建
模型,而只在
View2
中填充它。。。并在自己的模块中预先创建它。换言之:

// theLoginData.js
define(['LoginData'], function(LoginData) {
    return new LoginData();
});

// View #2
define(['theLoginData'], function(theLoginData) {
    return Backbone.View.extend({
        someMethod: function() {
            theLoginData.set(whatever);
        }
    });
});

 // View #1
define(['theLoginData'], function(theLoginData) {
    return Backbone.View.extend({
        someOtherMethod: function() {
            var whatever = theLoginData.get('whatever');
        }
    });
});
另一个选项是仍然在View2中创建
模型
,但在更全局的范围内“注册”它(例如,作为登录数据
模型
类的静态属性):


你能澄清一下你的问题吗?您会说“这是对主干网的错误使用还是需要,或者这还不错…”,但我不清楚您所说的“那”是什么意思。我将尝试理解并调整您提供的第一个解决方案。但现在让我告诉你我所理解的。因为模块
yourModel
本身确实实例化了自身,所以如果我将它们交给这个模块,这个实例可以从两个视图中访问,因此它的实例作为它们的依赖性。所以我可以得到我想要的;来自不同视图的同一模型实例。正确。
模型
是在加载时创建的,而您的
视图
只会在运行时引用它(即,它们从
视图
的方法中引用它,而不是直接在模块的顶层),因此可以保证它们始终可以使用该
模型。您的意思是,他们可以使用的
模型的实例。
// LoginData.js (ie. the Model class for your login data)
define([], function() {
    return Backbone.Model.extend({}, {
        currentLoginData: null
    });
});


// View #2
define(['LoginData'], function(LoginData) {
    return Backbone.View.extend({
        someMethod: function() {
            LoginData.currentLoginData = new LoginData(whatever);
        }
    });
});

 // View #1
define(['LoginData'], function(LoginData) {
    return Backbone.View.extend({
        someOtherMethod: function() {
            var whatever = LoginData.currentLoginData.get('whatever');
        }
    });
});