gpt4 book ai didi

angularjs - 有没有这样的时间可以接受在 $root 上访问服务?

转载 作者:行者123 更新时间:2023-12-01 04:56:19 25 4
gpt4 key购买 nike

现在,我知道全局变量是一种反模式,在 Angular 世界中可能比在其他地方更是如此……但是,我遇到了一个我倾向于打破规则的用例……

我已经阅读了这里的评论,并且强烈同意所有指出我的想法所代表的反 Angular 主义以及它通常是反模式的海报......
Angular JS - Make service globally accessible from controllers and view

但是,现在对于我的用例,我有一个 $theme 服务,其中包含许多变量和常量,例如图像和字符串的路径。

我们还有一个组件框架,应用程序设计人员都可以通过指令访问这些组件,允许我们的大多数应用程序仅使用我们的内部框架以标记指令的形式构建。

我可以为每个需求制定指令,但是它会牺牲 View 和主题之间低耦合的灵 active ,允许开发人员直接在 View 中访问 $theme 服务,而无需(重新)编写 Controller (甚至为一切创建 Controller )或实现新指令,这将允许它们纯粹在内部框架提供给它们的标记中工作。基本上我想让应用程序设计人员能够纯粹在标记中工作。
我们还制定了包含对 ngResource 的引用并在当前 $scope 上公开资源方法的指令,以及将当前 $scope 绑定(bind)到 $stateParam 服务上的变量等的指令,希望您能明白这一点。 ..

例如

<h1>{{$root.$theme.NAME}}"</h1>
<img my-src="$root.$theme.logo.url" />

而不是带有 Controller 和指令的大量代码......
<my-theme-name />
<h1 my-theme-name />
<my-theme-logo />
<img my-theme-logo />

这两种方法之间的区别在于指令附加了主标记的那些,它纯粹是一个装饰器,在前一种情况下,指令是主标记,指令模板将确定生成的主标记。在我们将指令纯粹用作装饰器而不是信息专家的方法中,略有不同会产生更大程度的灵 active 。

但是,不必一起编写指令,也许对于纯粹添加到单个主题的东西,只是为了在单个应用程序中使用,在这种情况下,在 $theme 服务中添加支持似乎是错误的方法......

但是,使用严格的自定义指令驱动方法,它可能会让我们更容易地移植到例如Angular2 甚至其他东西,只需构建一个适配器或转译器,无需重写任何标记,只需将指令重新连接到新库中编写的新 Controller 和处理程序。

所以,回到我的问题,如果我们解决这个测试警告,它是否是一种可行的方法,或者它是一条通往全局变量 hell 的滑路,很快我们就会用大量的东西污染我们的 $root,因为它是简单的方法?

_____ 2016 年 5 月 7 日更新 _____

好的,当我突然被迫将我的 $fileSaver 服务也放在全局范围内时,我决定不让我的主题服务在全局范围内可用,这表明我对“范围蔓延”的恐惧是有效的,而是我决定实现 <my-injector my-name="$theme" />该指令允许应用程序设计人员以声明方式导入服务,该指令使 myName 属性中指定的注入(inject)目标在当前范围内可用。

它允许应用程序设计人员在范围内的任何地方使用该服务,如下所示:
<my-injector my-name="$theme" />
<img ng-src="$theme.logo.url" />

我考虑过创建不同的便利指令,例如一些应用程序设计师可能会发现 <my-import my-name"$theme" /> 更直观,但这是一个不同的讨论......

最佳答案

避免 rootScope 并不是绝对必要的。来自 Angular FAQ ,我强调:

Of course, global state sucks and you should use $rootScope sparingly, like you would (hopefully) use with global variables in any language. In particular, don't use it for code, only data. If you're tempted to put a function on $rootScope, it's almost always better to put it in a service that can be injected where it's needed, and more easily tested.

Conversely, don't create a service whose only purpose in life is to store and return bits of data.


由于您的主题似乎主要是数据,我说为什么不使用root?如果它确实包含功能,是否可以拆分它?我无法为你做出决定,我还没有看到你真正想要做什么......

关于angularjs - 有没有这样的时间可以接受在 $root 上访问服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37017259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com