今天做项目,重构一个组件的时候,无端报了一个这样的错!Error: [ng:areq] Argument ‘fn’ is not a function, got undefined,花了我很久的时间才找到这个错误!原来是因为我注册的component组件时候出了问题!项目结构比较复杂,我直接用一个最简单的例子来说下!
<body>
<div ng-app="App">
<custom-tag>
</custom-tag>
</div>
</body>
<script>
angular.module("App", []).component("customTag", {
template: "123",
bindings: {
uploadConfig: '<',
},
controllerAs: 'ctrl',
transclude: true,
controller: ["test", function (test) {
}]
}).service("test", function () {
})
</script>
上面的例子很简单,注册一个’customTag’component和一个’test’service,并且这个’customTag’component注入这个’test’service,上面的代码是没有问题,能正常跑,但是你注册的service找不到构造函数的话就有问题的(因为项目比较复杂,不会这样注册),下面我直接写个undefined,看下面代码!
<body>
<div ng-app="App">
<custom-tag>
</custom-tag>
</div>
</body>
<script>
angular.module("App", []).component("customTag", {
template: "123",
bindings: {
uploadConfig: '<',
},
controllerAs: 'ctrl',
transclude: true,
controller: ["test", function (test) {
}]
}).service("test", undefined)
</script>
这样就会报错:
今天也是碰到这个问题,顺便发下项目的注册方法!(项目比较复杂,今天的这个问题也是找了很久才发现)
uibuilderModule.js
var BLANK_MODULE = {
states: [],
components: {},
directives: {},
services: {},
filters: {},
configBlocks: [],
runBlocks: [],
providers: {},
factories: {}
};
/**
* @param ngModule `angular.module()`对象
* @param appModule 由组件、状态、服务等组成的功能模块
* @description 注册每个app模块的状态、指令、组件、过滤器和服务,使用' uibuilderModule '配置/运行模块
*/
var appStartModule = angular.module(nainAppName, moduleList);
function registrationModule(ngModule, appModule) {
var module = Object.assign({}, BLANK_MODULE, appModule);
Object.keys(module.components).forEach(function (name) {
ngModule.component(name, module.components[name]);
});
Object.keys(module.directives).forEach(function (name) {
ngModule.directive(name, module.directives[name]);
});
Object.keys(module.services).forEach(function (name) {
ngModule.service(name, module.services[name]);
});
Object.keys(module.providers).forEach(function (name) {
ngModule.provider(name, module.providers[name]);
});
Object.keys(module.filters).forEach(function (name) {
ngModule.filter(name, module.filters[name]);
});
Object.keys(module.factories).forEach(function (name) {
ngModule.factory(name, module.factories[name]);
});
module.configBlocks.forEach(function (configBlock) {
ngModule.config(configBlock);
});
module.runBlocks.forEach(function (runBlock) {
ngModule.run(runBlock);
});
return ngModule;
};
exports.registrationModule = registrationModule;
exports.uibuilderModule = appStartModule;
上面代码是最终注册的地方,下面是services,components,directives,providers等的对象集合
index.bootstrap.js
var mainAppModule = {
services: {
restService: restService.service,
fileService: fileService.service,
productInstanceService: productInstanceService.service,
builderConfigsService: builderConfigsService.service,
simplifyBomService: simplifyBomService.service,
propertyModelService: propertyModelService.service,
builderUserDesign: builderUserDesign.service,
productService: productService.service,
productConfigRuntimeRestService: productConfigRuntimeRestService.service,
productInstanceRestService: productInstanceRestService.service,
propertyModelInitializeManager: propertyModelInitializeManager.service,
indexManager: indexManager.service,
commonFactory: commonFactory.service,
konvaFactory: konvaFactory.service,
simplifyBomManager: simplifyBomManager.service,
productInstanceInitializeManager: productInstanceInitializeManager.service,
builderViewRuntimeManager: builderViewRuntimeManager.service,
oldSBomNodeDataManager: oldSBomNodeDataManager.service,
newSBomNodeDataManager: newSBomNodeDataManager.service,
navigationManager: navigationManager.service,
uploadVerify: uploadVerifyService.uploadVerify,
builderViewRuntimeConver: builderViewConver.BuilderViewRuntimeConver,
imageLibraryManager: imageLibraryManager.service,
konvaManager: konvaManager.service,
konvaEditBoardManager: konvaEditBoardManager.service,
canvasPageManager: canvasPageManager.service,
layerPageManager: layerPageManager.service,
publicBoardManager: publicBoardManager.service,
builderTextRestService: builderTextRestService.service,
pageContentSchemaManager: pcsManager.PageContentSchemaManager,
pageContentRuntimeManager: pcRuntimeManager.PageContentRuntimeManager,
pcElementsManager: pcElementsManager.PCElementsManager,
uniqueIdGenerator: uniqueIdGenerator.UniqueIdGenerator,
canvasManager: canvasManagerFile.CanvasManager,
pageContentSchemaConstraintManager: pcsConstraintManager.PageContentSchemaConstraintManager,
/**
* singleViewBoard
*/
pageContentConverterService: pageContentConverter_service.pageContentConverter,
transformToolService: transformTool_service.transformToolService,
konvaElementDeleteService: konvaElementDelete_service.konvaElementDeleteService,
konvaElementMoveService: konvaElementMove_service.konvaElementMoveService,
konvaElementCenterService: konvaElementCenter_service.konvaElementCenterService,
konvaBgColorPanelService: konvaBgColorPanel_service.konvaBgColorPanelService,
konvaBgImagePanelService: konvaBgImagePanel_service.konvaBgImagePanelService,
konvaFontPanelService: konvaFontPanel_service.konvaFontPanelService,
konvaUserPictureService: konvaUserPicture_service.konvaUserPictureService,
konvaTipOnService: konvaTipOn_service.konvaTipOnService,
CommandHistoryService: commandHistory.CommandHistoryService,
boardScale: boardScale_service.boardScale,
boardScaleService: boardScale_service.boardScale,
pageContentEditor: pageContentEditor_service.pageContentEditor,
konvaToolBarService: konvaToolBar_service.konvaToolBarService,
algorithm: algorithm_service.algorithm,
publicBoardManager: publicBoardManager.service,
immediatelyManager: immediatelyManager.service,
detailManager: detailManager.service,
templateConfigsService: templateConfigsService.service
},
components: {
imageLibrary: imageLibraryComponent.imageLibrary,
progressBar: progressBarComponent.progressBar,
picListPanel: picListPanelComponent.picListPanel,
filesUpload: filesUploadComponent.filesUpload,
openLibraryButton: openLibraryButtonComponent.openLibraryButton,
errorMessage: errorMessageComponent.errorMessage,
errorTips: errorTipsComponent.errorTips,
fontLibrary: fontLibraryComponent.fontLibrary,
fontPanel: fontPanelComponent.fontPanel,
h1NavBar: h1NavBar.h1NavBar,
diceNavBar: diceNavBar.diceNavBar,
/**
* singleViewBoard
*/
imageEditor: imageEditor_component.imageEditor,
textEditor: textEditor_component.textEditor,
imgBrightness: imgBrightness_component.imgBrightness,
toolBar: toolBar_component.toolBar,
imgFilter: imgFilter_component.imgFilter,
fontEditor: fontEditor.fontEditor,
onLoading: onLoading.onLoading,
singleViewUploadEditBoard: singleViewUploadEditBoard.singleViewUploadEditBoard,
templateDownload: templateDownload.templateDownload,
pdfUpload: pdfUpload.pdfUpload,
thirdErrorTips: thirdErrorTips.thirdErrorTips,
filesUploadPdf:filesUploadPdf.filesUploadPdf
},
directives: {
singleViewEditBoard: singleViewEditBoard.singleViewEditBoardDirective,
/**
* singleViewBoard
*/
singleViewBoard: singleViewBoard_directive.singleViewBoard,
imageView: imageView_directive.imageView,
command: command_directive.CommandDirective,
boardElementCentered: boardElementCentered_directive.boardElementCentered,
boardElementMoveTier: boardElementMoveTier_directive.boardElementMoveTier,
boardElementUndoRedo: boardElementUndoRedo_directive.boardElementUndoRedo,
boardElementDelete: boardElementDelete_directive.boardElementDelete,
imgTransformEdit: imgTransformEdit_directive.imgTransformEdit,
imgScaleEdit: imgScaleEdit_directive.imgScaleEdit,
boardElementDrag: boardElementDrag_directive.boardElementDrag
},
providers: {
command: commandFactory_provider.CommandFactory
},
configBlocks: [commandConfigBlock]
};
uibuilderModule.registrationModule(uibuilderModule.uibuilderModule, mainAppModule);