我应该在注入的 Angular 服务上使用只读而不是公开它们吗?

2024-01-08

今天我进行了一次讨论,我的一些同事说他们像这样注入 Angular 服务:

constructor(readonly language: I18nService)

他们说他们这样做是因为它可以防止我的组件的使用者更改注入的服务,有点像这样:

@Component({ ... })
class ComponentA {
    constructor(public language: I18nService) {}
}

@Component({ ... })
class ComponentB {
    @ViewChild(ComponentA) compA: ComponentA;
    constructor() {
        this.compA.language = new I18nService();
    }
}

因此,虽然从技术上讲他们是正确的,但我仍然不相信我应该这样做。我问自己以下问题:

  1. DI 是 Angular 的基本组成部分。如果有人真的这么做了,这个人是应该更好地进入这个坑并失败,还是他/她根本做不到?

  2. readonly对于刚开始学习 Angular 和 TypeScript 的人来说,这种情况可能很难理解,原因有几个

    • Angular 在其任何官方 DI 文档中均未使用此方法
    • 你需要知道如何readonly有效,它只是保护我注入的服务的引用,但没有任何属性
  3. 在我看来,这是一个极端情况问题,尽管有一个简单的解决方案

你怎么认为?有没有我可能没见过的官方参考资料?当我尝试用谷歌搜索时,我没有找到任何东西readonly在 Angular 概念中

最后一句话:虽然这是 100% 真实的 - 可以操纵public service: Service- 我仍然不确定这个问题是否应该得到解决,并且正在纠结是否要这样做。


这不是你必须做的事情,但这样做是很好的做法readonly因为您可能不想再次重新分配实例。

只读属性可以具有初始值设定项,并且可以在同一类声明内的构造函数中进行赋值,但除此之外,不允许对只读属性进行赋值。

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

我应该在注入的 Angular 服务上使用只读而不是公开它们吗? 的相关文章

  • 使用 PHPUnit 和 Mockery 进行 Laravel 测试 - 设置控制器测试的依赖关系

    在终于通过了我愚蠢的简单测试后 我有一种感觉 我做得不对 我有一个 SessionsController 负责显示登录页面并让用户登录 我决定不使用外观 这样我就不必扩展 Laravel 的 TestCase 并在单元测试中承受性能影响 因
  • 使用 Reader Monad 进行依赖注入

    我最近看到了谈话极其简单的依赖注入 http www youtube com watch v ZasXwtTRkio and 无需体操的依赖注入 http vimeo com 44502327关于 Monads 的 DI 并留下了深刻的印象
  • npm 错误!遵循 Angular 2 快速入门时出现无效名称:“@angular/core”

    我正在尝试遵循Angular 2 快速入门 https angular io docs ts latest quickstart html 第一步是设置环境 我对 npm 并不是完全陌生 我设法安装并尝试了 Ember 但仅此而已 下面是我
  • 我如何使用 ngRedux 测试服务

    我如何用 karma jasmine 模拟 ngRedux 的 getState 例如 我的服务通过 ngRedux 从商店获取价值 this ngRedux getState 我通过监视 getState 方法解决了这个问题 spyOn
  • 使用 ngx-translate 时更改 URL

    当有人使用 ngx translate 单击所选语言时 我尝试更改 URL 我想我应该通过订阅语言更改事件然后修改当前的 url 以反映所选的语言来做到这一点 因为我是新手 所以我不确定是否需要服务来做到这一点 或者可能是另一种解决方法 我
  • 使用 ngFor 的内联样式背景图像

    我正在尝试为 ngFor 循环中的每个 div 设置背景图像 在我循环的 JSON 中 我有一个属性property Image包含图像的 url 字符串 img src flag properties Image 有效 但我尝试将图像显示
  • npm install 的问题(Angular)

    今天我尝试创建一个新项目 所以我使用这个命令 ng new NAME style less 并在我的cmder中弹出错误和警告 所以我卸载了 Roaming npm 和 npm cache 中的节点和文件 然后我安装了node并再次下载cm
  • 角度编译速度慢

    我有一个API in Symfony PHP 我用它来测试postman它就像一个魅力 但当我这样做时ng serve aot optimization应用程序开始构建并且消息compiled successfully 需要一分多钟 当我需
  • Guice 忽略注入构造函数参数上的 @Nullable

    我正在使用 Guice v 3 0 并且有一个值被注入到构造函数中 该值可以为 null 因此我在构造函数中使用 Nullable 来自 javax annotations 注释了该参数 public MyClass Parameter1
  • 如何将第一个选项设置为选定的选项,其中选项是从选择框 anular 4 中的循环构建的

    我曾从事 Angular 4 项目 在这个项目中 我需要将第一个选项设置为选定的 其中所有选项都是通过循环动态创建的 html代码
  • 如何创建一个非单例的 Angular JS 服务?

    因为每个服务都是单例 调用 injector get 每次仍然给我相同的实例 如何在另一个服务中使用一个服务的多个实例 请记住 我的非单例类的声明不得污染全局命名空间等 我的示例如下 我希望 injector get serviceCall
  • Angular 2 Renderer2 - 它是如何工作的

    我试图理解在 Angular 2 的指令或组件中添加 renderer2 装饰的必要性 来自文档 渲染器2文档 https angular io api core Renderer2他们没有提供其工作原理的示例 谁能用完整的例子解释一下 请
  • 可从数组观察

    我目前对 Angular2 和 Observable 对象有疑问 我有一个调用服务的组件 一个链接到 api 的真实组件和一个假组件 链接到 API 的服务运行良好 但当我使用假的服务时 我想从 Observable 对象返回一个数组 但出
  • 根据屏幕尺寸更改 md-grid-list 的布局或 cols 值

    我正在使用的网格列表角材2 https material angular io components grid list examples 这是笨蛋https plnkr co edit 0v9R3e4x3tThh85147x7 p pre
  • Angular2:禁用表单构建器的元素

    我试图在声明后禁用表单构建器的一个元素 因为加载视图后我必须验证某些内容 所以这是我的表单构建器声明 ionViewDidLoad this purchaseDataForm this formBuilder group kms Valid
  • 无法绑定到“属性 X”,因为它不是“子组件”的已知属性

    在我的项目中 我有一个通用类和一些从该类继承的其他组件 BaseRdnInput ts Injectable export abstract class BaseRdnInput implements ControlValueAccesso
  • Angular2 - 防止复选框被选中

    我有一个每行包含一个复选框的表 在表头中 我有一个Check All切换所有表格行框的复选框 我正在尝试实现一些逻辑 如果复选框的数量将超过特定限制 则显示错误并且不切换表行复选框或checkall盒子本身 有一个问题允许checkAll即
  • 在 Angular 6 中添加 Xsrf-Token 时出现问题

    通过 API 提交的表单中的数据已成功发布 但是将 X CSRF TOKEN 添加到标头并设置后withCredentials true结果数据未发布到名为的脚本insert php Error 加载失败http localhost sim
  • 角度距离计算

    我正在使用角度制作距离计算应用程序 Html
  • 如何以编程方式切换 Angular 材质扩展面板

    我刚刚开始从事 Angular 4 项目的材料设计工作 我目前正在研究扩展组件 API 规定 https material angular io components expansion overview that 用户无法切换禁用的扩展面

随机推荐