依赖注入与托管依赖关系与全局对象

2024-04-23

我正在 Javascript + BackboneJS (一个 MVC 框架)+ RequireJS 框架中工作,但这个问题有点 OO 通用。

首先让我解释一下,在 Backbone 中,您的视图是传统视图和控制器的混合,而您的 HTML 模板是传统的 MVC 视图

我已经为此绞尽脑汁有一段时间了,我不确定正确/务实的方法应该是什么。

我有一个 User 对象,其中包含许多代码所依赖的用户首选项(例如单位系统、语言选择等)。

我的一些视图在不使用模板的情况下完成大部分工作(通过使用第三方库,例如映射和图形库),因此它们依赖于用户对象来处理单位转换等问题。我目前正在使用 RequireJS 来管理该依赖关系,而不会过多破坏封装。

我的一些视图本身只做很少的工作,只将模型数据传递给我的模板引擎/模板,它们完成工作并且确实依赖于用户对象,同样,对于单位转换之类的事情。将此依赖项传递到模板的唯一方法是将其注入到模型中,并将模型传递到模板引擎中。

我的问题是,如何最好地处理这种广泛需要的依赖关系? - 创建一个可随处访问的应用程序范围的引用/全局对象? (YUK) - 使用 RequireJS 托管依赖项,尽管通常只建议对类/对象定义而不是具体对象使用托管依赖项加载。 - 或者,只使用依赖项注入,并手动将该依赖项传递到需要它的所有内容中?


从纯粹的技术角度来看,我认为可交换全局变量(可能会改变的全局变量),尤其是在 javascript 中,是危险且错误的。特别是因为 javascript 充满了异步执行的代码部分。考虑以下代码:

window.loggedinuser = Users.get("Paul");
addSomeStuffToLoggedinUser();
window.loggedinuser = Users.get("Sam");
doSomeOtherStuffToLoggedinUser();

Now if addSomeStuffToLoggedinUser()在某处异步执行(例如,它执行 ajax 调用,然后在第一个 ajax 调用完成时执行另一个 ajax 调用),当它到达第二个 ajax 调用时,它很可能正在向新登录用户(“Sam”)添加内容。显然不是你想要的。

话虽如此,我更不支持拥有一些我们一直从一个函数传递到另一个函数的用户对象,无休无止。

就我个人而言,必须在这两种邪恶之间做出选择,我会选择“很少改变”的事物的全球范围——除非我正在建造核电站或其他东西。因此,我倾向于让登录的用户在我的应用程序中全局可用,冒着这样的风险:如果由于某种原因某些调用运行得很晚,并且我遇到了一种情况,一个用户注销而另一个用户直接登录,某些情况奇怪的事情可能会发生。 (话又说回来,如果流星撞入托管我的应用程序的数据中心,也可能会发生奇怪的事情......我也没有防范这种情况)。实际上,一个可能的解决方案是在有人注销后立即重新加载整个应用程序。

所以,我想这一切都取决于你的应用程序。让它变得更好的一件事(并且让你感觉你仍然获得了一些 OO karma 点)是将你的数据隐藏在一些命名空间的单例中:

var myuser = MyApp.domain.LoggedinDomain.getLoggedinUser();
doSomethingCoolWith(myuser);

代替

doSomethingCoolWith(window.loggedinuser);

虽然最后几乎是一样的事情......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

依赖注入与托管依赖关系与全局对象 的相关文章

  • 如何检索 jquery $.ajax 对象的responseJSON属性[重复]

    这个问题在这里已经有答案了 我有这个 JavaScript ajax ajax type GET url DBConnect php data dataType json success function data error functi
  • 运行 npm install 时出错 Error: 404 Not Found: 7zip-bin@~4.1.0

    当我运行 npm install 时 我看到此错误 3 verbose stack Error 404 Not Found 7zip bin 4 1 0 2293 verbose stack at fetch then res C cygw
  • 了解执行模型和事件循环

    我读过很多关于JavaScript单线程执行模型 事件循环和事件队列的文章 但有一件事尚不清楚 我创建了一个小提琴来说明我的问题 http jsfiddle net yzpmf67f http jsfiddle net yzpmf67f
  • 如何从类外部更改公共 R6 类方法?

    我希望能够在我的 R6 类中重新定义公共方法 以便它根据该类保存的数据类型进行更改 如下所示 library R6 Simple lt R6Class Simple public list dt mtcars my print functi
  • 对 JavaScript 中的 while 循环感到困惑

    我可能在这里有点厚重 但请回答我这个问题 考虑以下代码 a 1 while a lt 6 console log a a 如果我运行这个 我会在控制台中得到从 1 到 6 的值 然后是另一个 6 现在看看这个 a 1 while a lt
  • Angular 2 最终版本路由器单元测试

    如何使用 karma 和 jasmine 对 Angular 2 0 0 版中的路由器进行单元测试 这是我的旧单元测试在版本 2 0 0 beta 14 中的样子 import it inject injectAsync beforeEac
  • 按自定义字母顺序对数组进行排序

    如何对这样的数组进行排序 apple very auto tom tim violet 要按 v a t x b 等排序 不按字母顺序 violet very auto tom tim 在脚本中 我会做这样的事情 myArray sort
  • 如何滚动到 jQuery Mobile 中的页面元素?

    我有一个很长的 jQuery 移动页面 并且想在页面加载后滚动到该页面中间的元素 到目前为止 我已经尝试了一些事情 最成功的是 jQuery document bind mobileinit function var target if t
  • 如何获取调用函数的“this”值?

    如果我有一个这样的函数 function foo this console log this function bar bar prototype func function foo this var test new bar test f
  • 使用JS将图像的特定背景颜色设置为透明

    我正在使用以下代码来修改图像的透明度 然而 我想做的只是修改图像的背景颜色并将其 alpha 通道设置为 0 而不是整个图像 以下代码将整个图像的 Alpha 透明度设置为 0 var ctx this data getContext 2d
  • 避免 AngularJS 部分视图在 IE 中缓存

    我正在开发一个 ASP NET MVC 应用程序 它也有一些 angularJS 我有一个主页 其中有不同的选项卡 当您单击它们时 它们会加载角度部分视图 主页是这样的 div class widget div div class widg
  • Node.js 和 Express:异步操作后如何返回响应

    我是 Node js 新手 所以我仍然对异步函数和回调很感兴趣 我现在的难题是如何在异步操作中从文件读取数据后返回响应 我的理解是发送回复的工作方式如下 这对我有用 app get search function req res res s
  • 获取键盘事件中的鼠标位置

    我试图在用户按住 Shift 键时出现选择轮 滚轮应以鼠标位置为中心 然而当我测试这个时 pageX and clientX两者在事件对象上都未定义 是否可以通过键盘事件获取鼠标坐标 不 只需跟踪mousemove事件并持续保存当前位置 以
  • Firefox OS 后台服务

    我想构建一个应用程序 用户可以通过它输入一些设置 并且应用程序将启动后台服务来根据这些设置执行一些任务 我只想在模拟器中运行应用程序和后台服务 我知道它需要 认证 模式才能运行后台服务 但我现在不考虑在 Firefox Marketplac
  • JavaScript - 这个这个

    String prototype foo String prototype foo bar function How can you reference the grandparent string console log this par
  • 用于客户端存储和服务器端同步的javascript库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 javascript 库 它可以让我将数据存储在客户端数据库中 并在后台自动将数据库同
  • CKEditor TypeError:c[a] 在 CodeIgniter 中未定义

    我正在尝试在基于 codeigniter 的网站中安装 CKEditor 并且我已按照本教程进行操作 Codeigniter 教程中的 CKEditor http nukium com developpement php framework
  • 如何在 svelte 中制作搜索过滤器

    我有两个组件在组件树中距离很远 我对如何在两者之间进行通信存有疑问 我有搜索组件 listItems 和商店 商店 svelte
  • 如何在odoo中重写js函数

    我想加载 shop checkout url 函数是 odoo define change info order website sale change info order function require use strict oe w
  • Javascript:修改原型不会影响现有实例[重复]

    这个问题在这里已经有答案了 我创建了原型的 2 个实例 更改了原型中的函数 更改反映在两个实例中 很棒 但是 当我通过删除该函数来修改原型时 该函数对于现有实例仍然存在 function A this name cool A prototy

随机推荐