【问题标题】:How to get VS Code's Intellisense to work with AngularJS's injected services?如何让 VS Code 的 Intellisense 与 AngularJS 的注入服务一起工作?
【发布时间】:2018-09-23 08:41:23
【问题描述】:

所以我试图让 Visual Studio Code 为我的 AngularJs(不是 Angular)应用程序的服务提供智能感知。我设法获得了角度的标准类型(现在当我输入“角度”时,它建议像模块等东西)。这很有效,而且很棒,但是我找不到让它与我的服务(或工厂)一起工作的方法。我知道,对于一个 IDE 来说,通过依赖注入等来计算代码并不是那么容易。

但是当我的控制器和它使用的服务都在同一个 JS 文件中时,它似乎工作正常!我遇到的唯一问题是我的应用程序太大而不能全部放在一个 JS 文件中,并且一旦我将代码拆分到多个文件中,它就会失败。

请注意,我已尝试使用“三斜杠指令”(///),但没有帮助。 我整天都在努力解决这个问题,非常感谢任何帮助。

代码示例:

var app = angular.module('app', []);

app.controller('ctrl', ['$scope', 'test',
    function ($scope, test) {

        $scope.test = test.word; //TRY TYPING 'test.' --> want to have intellisense suggest 'word'

}]);
//PUT THE BELOW IN ANOTHER FILE AND INTELLISENSE DOES NOT SHOW 'word'
app.service('test', [function(){
    /**
     * @type {string}
     */
    this.word = "balls";
    /**
     * @function
     * @param {string} variable
     */
    this.getLower = function (variable) {
        return variable.toLowerCase();
    }
}]);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
  <div ng-controller="ctrl">
    <p class="lead">{{test}}</p>
  </div>
</div>

【问题讨论】:

    标签: javascript angularjs visual-studio-code intellisense


    【解决方案1】:

    您提到尝试使用三斜杠指令,但不清楚(至少从您的 sn-p 中)您是否真的在使用 TypeScript。如果您不使用后者,那么如果您想在文件中改进 IntelliSense,则需要使用。

    VS Code 为您提供您从 type definitions provided for AngularJS 看到的有限 IntelliSense。

    简而言之,您需要:

    以下是这种风格的一个非常简短的示例:

    // Service.ts
    export default class Service {
        constructor() {}
        log(message: string) {
            console.log(message);
        }
    }
    
    // Controller.ts
    import ng from 'angular';
    import Service from './Service';
    
    export default class Controller implements ng.IController {
        static $inject: string[] = ['Service'];
        constructor(private service: Service) {}
        $onInit() {
            this.service.log('Hello, world!');
        }
    }
    
    // App.ts
    import angular from 'angular';
    import Controller from './Controller';
    import Service from './Service';
    
    export const angular
        .module('app', [])
        .service('Service', Service)
        .controller('Controller', Controller)
        .name;
    

    如果您尝试上述方法,您应该能够为来自Controller.tsService 内部的log 调用获得IntelliSense。

    【讨论】:

    • 您好,感谢您回答这个问题,我是否理解正确,没有办法重构我的代码以使其正常工作吗?我打算最终转向 TypeScript,但现在我正试图“按原样”完成这一轮,我需要(真的想要)更强大的 IntelliSense 的原因是代码库变得越来越大(我知道,AngularJS不是真的为此而生...)所以现在改变它并不是一个真正的选择...
    • 明确一点:我不使用 TypeScript,但我确实完成了要点 #2。添加 tsconfig.json 文件应该不会太难,但我想知道是否有一种快速(而且不太脏)的方法来避免执行要点 #3?
    • 好吧,您可以使用 /// &lt;reference types="..." 并手动为 每个文件 中您想要 IntelliSense 的构造创建一个 *.d.ts(即分型)文件。但是,我不建议这样做。它以一种可以更好地提供推理的方式重复了您从创作源代码中获得的努力。至少,这仍然需要将现有的*.js 文件重命名为*.ts,以便可以应用三斜杠指令。
    • 好的,我想我会在这个上点击“中止任务”按钮。无论如何感谢您的帮助。
    猜你喜欢
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多