草庐IT

javascript - 依赖注入(inject)与托管依赖与全局对象

coder 2025-03-27 原文

我在 Javascript + BackboneJS(一个 MVC 框架)+ RequireJS 框架中工作,但这个问题有点面向对象。

首先让我解释一下,在 Backbone 中,您的 View 是传统 View 和 Controller 的混合体,而您的 HTML 模板是传统的 MVC View

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

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

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

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

我的问题是,如何最好地处理如此广泛需要的依赖项? - 创建一个可在任何地方访问的应用程序范围的引用/全局对象? (呸) - 使用 RequireJS 托管依赖项,尽管通常只建议对类/对象定义而不是具体对象使用托管依赖项加载。 - 或者,只使用依赖注入(inject),并手动将该依赖传递给所有需要它的东西?

最佳答案

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

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

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

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

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

所以,我想这完全取决于您的应用。使它变得更好(并且让你觉得你仍然获得一些 OO 业力点)的一件事是将你的数据隐藏在一些命名空间的单例中:

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

代替

doSomethingCoolWith(window.loggedinuser);

虽然最终还是一样的东西...

关于javascript - 依赖注入(inject)与托管依赖与全局对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12695832/

有关javascript - 依赖注入(inject)与托管依赖与全局对象的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  4. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  5. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  6. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  7. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  8. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  9. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  10. ruby - 一个 YAML 对象可以引用另一个吗? - 2

    我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的ruby​​yaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir

随机推荐