Javascript 在Visual Studio intellisense中是否仍有定义未定义对象的方法?

Javascript 在Visual Studio intellisense中是否仍有定义未定义对象的方法?,javascript,angularjs,visual-studio-2012,intellisense,javascript-intellisense,Javascript,Angularjs,Visual Studio 2012,Intellisense,Javascript Intellisense,假设我在AngularJS中有一个控制器: myApp.controller('SearchController', function ($scope, UserService) { // for intellisense, UserService is undefined here var user = UserService.getUsers().then(function(data){ //

假设我在AngularJS中有一个控制器:

myApp.controller('SearchController',
    function ($scope, UserService) {

        // for intellisense, UserService is undefined here
        var user = UserService.getUsers().then(function(data){
                             // yada yada
                   }, function(err){
                             // yada yada
                   });
    });
但是,在我的intellisense文件中,我可以动态注入UserService以获得如下功能:

intellisense.addEventListener('statementcompletion', function (event) {
    // tried doing this, but doesn't work!
    // event.target   = {};

    var injector   = angular.injector(['ng', 'myApp']);
    var dependency = injector.get(event.targetName);

    event.items    = [];
    for (method in dependency) {
        intellisense.logMessage(method);
        event.items.push({ name: method, kind: 'field', value: function () { } });
    }

});
现在,如果我有一个全局变量(或函数变量)定义为
UserService={}
,并且在我的控制器函数中,我键入
UserService。
我将得到服务中所有函数的弹出窗口。但是如果我没有定义它,因为它被intellisense解释为
未定义
,即使
语句完成
正在工作,它也不能向我显示选项(如Javascript语言服务控制台中所示)

我的问题是,除了对函数进行注释外,是否还要将
UserService
定义为intellisense文件中的对象?定义
event.target={}
不起作用(请参见上面的intellisense代码)。

一种有效的方法是使用空对象从intellisense代码“调用”组件函数(控制器、服务等)

我相信这会更干净,但我做了以下几点:

约翰·布莱索的

references.js-在工具>选项>文本编辑器>Javascript>智能感知>引用中添加此文件作为引用

    /// <reference path="../source/lib/assetBundle.js" />
    /// <reference path="_moduleDecorator.js" />
    /// <reference path="_componentDecorator.js" />
    /// <reference path="../source/app/appBundle.js" />

    intellisense.addEventListener('statementcompletion', function (event) {
    // for core angular objects
    addComponentToIntellisense('ng');
    // for custom objects in application modules
    for (var moduleIndex in modules) {
        addComponentToIntellisense(modules[moduleIndex]);
    }

    function addComponentToIntellisense(module) {
        var $injector = angular.injector(['ng', module]),
            dependency = $injector.get(event.targetName),
            dep;

        if (typeof dependency === "function") dep = new dependency();
        else dep = dependency;

        for (var method in dep) {
            event.items.push({ name: method, kind: 'field', value: dependency[method] });
        }
    }
});
\u componentDecorator.js-使用空对象参数“调用”组件函数

    (function () {
    // pick all the components in all modules and initialize them for intellisense
    for (var moduleIndex in modules) {
        var currentModule = angular.module(modules[moduleIndex]),
            queue = currentModule._invokeQueue,
            // add other components such as value, provider, etc later
            angularComponents = ['controller', 'factory', 'service', 'value'];

        for (var i = 0; i < angularComponents.length; i++) {
            var currentComponent    = angularComponents[i],
                originalComponentFn = currentModule[currentComponent];

            currentModule[currentComponent] = (function (currentModule, queue, originalComponentFn) {
                return function () {
                    originalComponentFn.apply(currentModule, arguments);
                    initializeComponents(queue);
                };
            })(currentModule, queue, originalComponentFn);
        }
    }

    function initializeComponents(queue) {
        var elem = queue.filter(function (element) {
            var componentName = element[2][0].toLowerCase();
            return (componentName.indexOf(componentName) !== -1);
        });

        for (var i = 0; i < elem.length; i++) {
            var tempComp = elem[i][2][1],
                compFunc;

            // for array notation for DI
            if (typeof tempComp !== "function") {
                compFunc = tempComp[tempComp.length - 1];
            } else {
                compFunc = tempComp;
            }

            // 10 parameter dependencies initialization for now
            compFunc({}, {}, {}, {}, {}, {}, {}, {}, {}, {});
        }
    }
})();
(函数(){
//选择所有模块中的所有组件,并为intellisense初始化它们
用于(模块中的var模块索引){
var currentModule=角度模块(模块[moduleIndex]),
队列=当前模块。\u调用队列,
//稍后添加其他组件,如值、提供程序等
angularComponents=[“控制器”、“工厂”、“服务”、“值”];
对于(var i=0;i
我现在使用的回退方法是将我的对象设置为空值,如果还没有设置,那么我就有了一个intellisense中的目标。在上面的示例中,我只包含$scope=$scope | |{};在我的活动开始时。这是一个黑客,但确实有效。我曾想过这样做,但它会弄乱源代码,这是不可取的。我所做的是“调用”角度组件(如控制器、服务等),它们基本上是intellisense代码中带有空对象的函数。瞧,你有你想要的所有智能感知!你到底是怎么做到的?你能给我指一个代码样本吗?看看答案。这让我很兴奋!非常感谢你发布这个。我正在考虑将我的实现打包到一个(麻省理工学院许可的)GitHub存储库中,但希望您允许我合并其中一些内容。我对它进行了大量修改,在找不到精确匹配时执行模糊匹配,允许提供程序注入,等等。我只是需要这个位来初始化带有空参数的函数。没问题。你可以把它打包。很高兴它帮了你:)哦,你能把回购协议贴在这里吗,这样我就可以看一看了?当然可以。可能是这个周末,但可能晚些时候,视情况而定。我真的很有兴趣把这个放到特定角度的Intellisense的Web Essentials中。如果你有兴趣分享,请告诉我
    (function () {
    // pick all the components in all modules and initialize them for intellisense
    for (var moduleIndex in modules) {
        var currentModule = angular.module(modules[moduleIndex]),
            queue = currentModule._invokeQueue,
            // add other components such as value, provider, etc later
            angularComponents = ['controller', 'factory', 'service', 'value'];

        for (var i = 0; i < angularComponents.length; i++) {
            var currentComponent    = angularComponents[i],
                originalComponentFn = currentModule[currentComponent];

            currentModule[currentComponent] = (function (currentModule, queue, originalComponentFn) {
                return function () {
                    originalComponentFn.apply(currentModule, arguments);
                    initializeComponents(queue);
                };
            })(currentModule, queue, originalComponentFn);
        }
    }

    function initializeComponents(queue) {
        var elem = queue.filter(function (element) {
            var componentName = element[2][0].toLowerCase();
            return (componentName.indexOf(componentName) !== -1);
        });

        for (var i = 0; i < elem.length; i++) {
            var tempComp = elem[i][2][1],
                compFunc;

            // for array notation for DI
            if (typeof tempComp !== "function") {
                compFunc = tempComp[tempComp.length - 1];
            } else {
                compFunc = tempComp;
            }

            // 10 parameter dependencies initialization for now
            compFunc({}, {}, {}, {}, {}, {}, {}, {}, {}, {});
        }
    }
})();