templateUrl函数未使用显式注释,无法在严格模式下调用

时间:2016-07-14 20:51:58

标签: javascript angularjs

我尝试创建一个基于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"; 
    }
}],

1 个答案:

答案 0 :(得分:4)

正如in this answer所述,$element$attrs被注入templateUrl函数,而不仅仅作为参数传递。这是Angular文档强调的element参数名称(在linkcompile函数中)与$element本地依赖在DI启用的函数之间的差异。

templateUrl函数在组件中是invoked by injector,因此任何其他服务也可以在那里注入,并且应该正确注释。