我正在尝试创建一个自定义 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参数名称(在linkcompile函数中)与启用DI的函数中的$element本地依赖性之间的区别。
templateUrl函数在组件中是invoked by injector,因此也可以在其中注入(inject)任何其他服务,并且应该对其进行正确注释。

关于javascript - templateUrl函数未使用显式注释,因此无法在严格模式下调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38384034/

10-12 13:03