Ber*_*rdo 5 javascript oop model-view-controller requirejs backbone.js
我正在使用Javascript + BackboneJS(一个MVC框架)+ RequireJS框架,但这个问题有些OO泛型.
首先让我解释一下,在Backbone中,您的视图是传统视图和控制器的混合,您的HTML模板是传统的MVC视图
我对此已经讨厌了一段时间,我不确定正确/务实的方法应该是什么.
我有一个User对象,其中包含许多代码所依赖的用户首选项(如单元系统,语言选择,其他任何东西).
我的一些视图在不使用模板的情况下完成大部分工作(通过使用第三方库,例如Mapping和Graphing libs),因此它们依赖于User对象来处理单位转换.我目前正在使用RequireJS来管理这种依赖,而不会过多地破坏封装.
我的一些视图本身很少工作,只将模型数据传递给我的模板引擎/模板,它们完成工作并且DO依赖于User对象,对于单位转换等事情也是如此.将此依赖项传递到模板的唯一方法是将其注入模型,并将模型传递到模板引擎中.
我的问题是,如何最好地处理这种广泛需要的依赖? - 创建一个可在任何地方访问的应用范围的参考/全局对象?(YUK) - 使用RequireJS托管依赖项,即使它通常仅建议使用托管依赖项加载类/对象定义而不是具体对象. - 或者,只使用依赖注入,并手动将该依赖项传递到需要它的所有内容中?
从纯粹的技术角度来看,我认为可交换全局变量(可能会改变的全局变量),尤其是在 javascript 中,是危险且错误的。特别是因为 javascript 充满了异步执行的代码部分。考虑以下代码:
window.loggedinuser = Users.get("Paul");
addSomeStuffToLoggedinUser();
window.loggedinuser = Users.get("Sam");
doSomeOtherStuffToLoggedinUser();
Run Code Online (Sandbox Code Playgroud)
现在,如果addSomeStuffToLoggedinUser()在某个地方异步执行(例如,它执行一个ajax调用,然后在第一个调用完成时执行另一个ajax调用),那么当它到达第二个时,它很可能正在向新的登录用户(“Sam”)添加内容阿贾克斯调用。显然不是你想要的。
话虽如此,我更不支持拥有一些我们一直从一个函数传递到另一个函数的用户对象,无休无止。
就我个人而言,必须在这两种邪恶之间做出选择,我会选择“很少改变”的事物的全球范围——除非我正在建造核电站或其他东西。因此,我倾向于让登录的用户在我的应用程序中全局可用,冒着这样的风险:如果由于某种原因某些调用运行得很晚,并且我遇到了一种情况,一个用户注销而另一个用户直接登录,某些情况奇怪的事情可能会发生。(话又说回来,如果流星撞入托管我的应用程序的数据中心,也可能会发生奇怪的事情......我也没有防范这种情况)。实际上,一个可能的解决方案是在有人注销后立即重新加载整个应用程序。
所以,我想这一切都取决于你的应用程序。让它变得更好的一件事(并且让你感觉你仍然获得了一些 OO karma 点)是将你的数据隐藏在一些命名空间的单例中:
var myuser = MyApp.domain.LoggedinDomain.getLoggedinUser();
doSomethingCoolWith(myuser);
Run Code Online (Sandbox Code Playgroud)
代替
doSomethingCoolWith(window.loggedinuser);
Run Code Online (Sandbox Code Playgroud)
虽然最后几乎是一样的事情......
| 归档时间: |
|
| 查看次数: |
754 次 |
| 最近记录: |