尝试使用jsdoc将JavaScript代码完成工作在netbeans中

时间:2014-08-21 05:48:31

标签: javascript netbeans-7 code-completion

在我的app.js中,我有以下内容:

angular.module('app').controller('userList', 
  ['appSettings'
 ,function (/*@type {app.appSettings}*/appSettings) {  
   appSettings.<<== it shows a list here but nothing from autocomplete.js

在我的autocomplete.js中,我有以下内容(由JavaScript打印出我的服务及其成员生成):

var app={};
app.appSettings={};
app.appSettings.userFailMessages={};
app.appSettings.userFailMessages.invalidJson
  ="Invalid request, user sent is not valid json.";

NetBeans拒绝为我编写完整的appSettings,并且似乎不知道它是在autocomplete.js中定义的。也许我的js文档错了,但尝试了@var,@ type和@param的组合,但没有成功。

当我输入app.appSettings.并从autocomplete.js给我一个列表时,代码就完成了,但我想知道如何告诉NetBeans该函数的传递参数是app.appSettings。

也许我应该让autocomplete包含构造函数而不是对象文字,因为@type表示某种类型而不是实例。

这是NetBeans 7.3.1

1 个答案:

答案 0 :(得分:1)

接近答案,让NetBeans使用have to define the type类型。然后,为了表明传递给角度模块(或任何函数)的参数属于某种类型,我使用@param jsdoc

角度模块:

angular.module('app').controller('userList'
 , ['$scope','appRules','appSettings'
 ,/**
* @param {app.appRules} appRules
* @param {app.appSettings} appSettings
* */
 function ($scope,appRules,appSettings,$timeout) {
   //<== here both appRules and appSettings give suggestions
   //  from autocomplete

autocomplete.js(不包含在我的html文件中,但仅用于代码建议)

/*@typedef {Object} app*/
var app={};
app.appRules={};
app.appRules.userIsInRole=function (user,role){};
app.appRules.general={};
app.appRules.general.isEmpty=function (val){};
app.appRules.general.isEmail=function (val){};
app.appSettings={};
app.appSettings.userFailMessages={};
app.appSettings.userFailMessages.invalidJson
 ="Invalid request, user sent is not valid json.";
app.appSettings.userFailMessages.noPrivilege
 ="You do not have the privileges needed to change this user.";

我在包含我的app的页面的控制台中运行以下代码以生成autocomplete.js:

var inj;
function allServices(mod, r) {
  if (!r) {
    r = {};
    inj = angular.element(document.querySelector('[data-ng-app]')).injector().get;
  }
  angular.forEach(angular.module(mod).requires, function(m) {
    allServices(m, r)
  });
  angular.forEach(angular.module(mod)._invokeQueue, function(a) {
    try {
      r[a[2][0]] = inj(a[2][0]);
    } catch (e) {
    }
  });
  return r;
};

var output=[];
function addOutput(names,prop){
  if(names.length===1){
    output.push('var ');
  }
  output.push(names.join('.'));
  if(typeof prop === 'object'){
    output.push('={};\n');
    for(thing in prop){
      //TODO: no arrays or route paths
      if(/[0-9\/\\]/.test(thing)){
        continue;
      }
      names.push(thing);
      addOutput(names,prop[thing]);
    }
  }else{
    output.push('=');
    output.push(
      (typeof prop === 'function')?
      prop.toString():
      JSON.stringify(prop)
    );
    output.push(';\n');
  }
  names.pop();
}

function createOutput(){
  allMyServices = allServices('app');
  addOutput(['app'],allMyServices);
  console.log(output.join(''));
}


createOutput();