我尝试创建一个基于templateUrl函数动态加载模板的自定义角度组件。我目前得到一个templateUrl
没有使用显式注释,并且不能在严格模式下调用'错误。通常我理解当注入的服务没有被正确注释时会出现这个错误(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";
}
}],
答案 0 :(得分:4)
正如in this answer所述,$element
和$attrs
被注入templateUrl
函数,而不仅仅作为参数传递。这是Angular文档强调的element
参数名称(在link
或compile
函数中)与$element
本地依赖在DI启用的函数之间的差异。
templateUrl
函数在组件中是invoked by injector,因此任何其他服务也可以在那里注入,并且应该正确注释。