在我的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
答案 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();