aurelia - 如何最好地使用 Aurelia 的全局服务类别

标签 aurelia

我有一些服务被我的应用程序中的许多类使用。例如,这可能是一个 LoggerService,它将消息记录到内部存储并将其打印到控制台。

该服务可能如下所示:

export class LoggerService {
    let _logs = [];

    addLog(msg) {
        this._logs.push(msg);
        console.log(this._logs.length + ': ' + msg);
    }
}

我猜 Aurelia 中通常的方法是使用此类进行依赖注入(inject),它工作得很好,因为它默认使用单例。示例用法如下所示:

import {autoinject, Aurelia} from 'aurelia-framework';
import {LoggerService} from 'LoggerService';

@autoinject
export class SomeViewModel {
    let _loggerService;

    constructor(loggerService) {
        this._loggerService = loggerService
    }

    somethingChanged() {
        this._loggerService.addLog('Something changed...');
    }
}

基本上这种方法工作得很好,但在更大的范围内感觉有点“笨拙”,我希望它可以被简化:

  • 使用依赖注入(inject)需要在每个“使用类”中使用大量样板代码,这会不必要地“膨胀”它们(导入语句、需要在构造函数中分配的专用类成员等)。
  • 我习惯于将此类类放在位于窗口对象中的专用命名空间中。这使我可以方便地进行调试,因为我可以直接从命令行调用 MyNamespace.LoggerService.addLog('blahblah'); 等代码。我如何与 Aurelia 一起实现这一目标?

是否有更直接的方法可以让我从命令行获得更好的调试体验?

最佳答案

诚实的回答?如果您遵循 ES6 模块化代码约定,则不然。如果需要,您将始终导入模块。您可以做一些事情,我将在这个答案中详细介绍。

如果您不想,实际上并不需要使用 Aurelia 的依赖注入(inject)。但是,这意味着您必须自己处理对象的生命周期。因为您的对象是一个类,所以在导入它时必须对其调用“new”。但是,您可以以不同的方式编写日志记录模块,并且可以导出函数,而不是导出类,如下所示:

let _logs = [];

export var LoggerService = {
    addLog: function (msg) {
        _logs.push(msg);
        console.log(_logs.length + ': ' + msg);
    }
}

这样,您所要做的就是导入 LoggerService 并在 Aurelia View 中调用 LoggerService.addLog ,而无需注入(inject)它。这是一种比类实例化方法更实用的方法,效果非常好。

import {LoggerService} from 'LoggerService';

export class SomeViewModel {    
    constructor() {
    }

    somethingChanged() {
        LoggerService.addLog('Something changed...');
    }
}

您可以做的另一件事(我不推荐这样做)就是将其设置为窗口变量。这意味着您不必导入模块。但这违反了模块原则,而且事情很快就会变得困惑。模块的存在是有原因的,尽管 import 语句确实增加了代码行,但其好处值得额外的空间。

对于您的用例,我将使用上面基于函数的方法,并且我会在某处检查“开发”标志,以便您可以公开窗口对象上的属性,以便您可以通过控制台访问它们。 (您不希望在生产环境中使用它,因为人们很容易搞乱您的应用程序。)类似于

if (developmentFlag) { window.loggerService = LoggerService; }

在我们能够在控制台 REPL 中运行 import 语句之前,这可能是最好的方法。

关于aurelia - 如何最好地使用 Aurelia 的全局服务类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42005275/

相关文章:

jquery - 捕获包含内联 svg 的 div 并将其下载为图像

semantic-ui - 如何将 Semantic-UI 与 Aurelia-Cli 集成?

aurelia - 我如何有条件地在 aurelia 模板中添加一个类

javascript - Aurelia 从自定义元素调用函数

javascript - 我如何获取 HTML 标签内的值并将其绑定(bind)到 aurelia 中的 ts(组件文件)

javascript - “Promise”是 Aurelia 的 ASP.NET Core SPA 模板中的未定义错误

javascript - 在向 DOM 动态添加自定义元素后,如何让 Aurelia 呈现我的 View ?

javascript - 定义一个等待 promise 返回的 NavigationInstruction

node.js - 无法替换到目录/var/lib/docker/overlay2/if2ip5okvavl8u6jpdtpczuog/merged/app/node_modules/@ampproject/remapping with file

typescript - 无法使用比较器自定义排序我的 ag-grid