我正在尝试创建一个自定义 Angular 组件,该组件将基于templateUrl函数动态加载模板。我目前收到一个templateUrl
没有使用显式注释,并且不能在严格模式下调用的错误。通常,我知道当未正确注释注入(inject)的服务时会出现此错误(https://docs.angularjs.org/error/ $ injector / strictdi)。但是,我不知道这如何适用于templateUrl
。
我正在使用Angular 1.5。
确切的错误消息是-angular.js:13550 Error: [$injector:strictdi] templateUrl is not using explicit annotation and cannot be invoked in strict mode
组件代码段:
angular.module('hive.triGrid')
.controller('TriGridCellController', ['$element', '$attrs', function ($element, $attrs) {
var $ctrl = this;
}])
.component('triGridCell', {
controller: 'TriGridCellController',
templateUrl: function($element, $attrs)
{
var type = $attrs.cellType;
if(type.toUpperCase() == "ICON")
{
return "components/grid/cellTemplates/iconCell.tpl.html";
}
else if(type.toUpperCase() == "CUSTOM")
{
return $attrs.cellTemplateUrl;
}
else
{
return "components/grid/cellTemplates/textCell.tpl.html";
}
},
//template:"<ng-include src='$ctrl.getTemplateUrl(z)'/>",
bindings: {
cellData:'<',
cellType: '<', //See triGridRow and triGrid for config JSON format.
}
});
编辑:
应用答案后的代码:
templateUrl: ['$element', '$attrs', function($element, $attrs)
{
var type = $attrs.cellType;
if(type.toUpperCase() == "ICON")
{
return "components/grid/cellTemplates/iconCell.tpl.html";
}
else if(type.toUpperCase() == "CUSTOM")
{
return $attrs.cellTemplateUrl;
}
else
{
return "components/grid/cellTemplates/textCell.tpl.html";
}
}],
最佳答案
如in this answer所示,$element
和$attrs
被注入(inject)templateUrl
函数中,而不仅仅是作为参数传递。这是Angt文档强调的element
参数名称(在link
或compile
函数中)与启用DI的函数中的$element
本地依赖性之间的区别。templateUrl
函数在组件中是invoked by injector,因此也可以在其中注入(inject)任何其他服务,并且应该对其进行正确注释。
关于javascript - templateUrl函数未使用显式注释,因此无法在严格模式下调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38384034/