AngularJS - $templateCache 未定义

AngularJS - $templateCache is not defined

我正在尝试在 AngularStrap 弹出窗口中加载模板文件,但是我在使用 $templateCache 时遇到了问题。我似乎比其他 SO 问题更进一步,因此这个看似双重的问题。

根据 API 文档,我在结束 </body> 标记之前添加了一个 <script type="text/ng-template" id="popoverTemplate.html"></script>。当我在我的页面上使用 <div ng-include="'popoverTemplate.html'"></div> 时,我什么也得不到。如果我尝试使用 console.log($templateCache.get("popoverTemplate.html")),我会得到“$templateCache is not defined”,这让我假设我错过了一个关键步骤。但是,我无法在文档或其他 SO 问题中找到如何操作。

编辑: 注入服务是缺失的 link。但是,当我注入服务时,控制器的其他功能不再起作用,但是如果您注入所有函数的参数,工作代码将变为:

(function() {
    "use strict";
    angular.module("app").controller("managerController", ["$scope", "imageHierarchyRepository", "$templateCache", function ($scope, imageHierarchyRepository, $templateCache) {
        imageHierarchyRepository.query(function(data) {
            $scope.hierarchies = data;
        });

        var template = $templateCache.get("popoverTemplate.html");
        console.log(template);
    }]);
})();

使用模板脚本标签。您必须将其插入到 angular 应用程序中。如果您不使用 ng-app 标签,它位于具有 ng-app 属性的元素或用于 bootstrap 应用程序的元素内。

<body ng-app="myapp">

  <div ng-template="'myTemplate.html'"></div>

  <script type="text/ng-template" id="myTemplate.html">
    // whate ever
  </script>
</body> 

如果您想在应用程序的组件上检索模板,则需要在您想要使用它的地方注入服务:

controller('FooCtrl', ['$templateCache', function ($templateCache) {
  var template = $templateCache.get('myTemplate.html');
}]);

controller('FooCtlr', FooCtrl);

FooCtrl ($templateCache) {};

FooCtrl.$inject = ['$templateCache'];

编辑

不要注册两个具有相同名称的控制器,因为这样您会用最后一个覆盖第一个。

(function() {
    "use strict";
    angular.module("app").controller("managerController",["$scope", "imageHierarchyRepository", "$templateCache", function ($scope, imageHierarchyRepository, $templateCache) {
        var template = $templateCache.get("popoverTemplate.html");
        console.log(template);
        imageHierarchyRepository.query(function(data) {
            $scope.hierarchies = data;
        });
    }]);


})();

小补充:尽管实现目标的方法很少,比如将整个 HTML 包裹在 <script> 标签中等等,最好的我的方法是将 $templateCache 逻辑添加到每个 Angular 指令中。这样,我就可以避免使用任何外部包,例如 grunt angular-templates(这对我的应用来说非常好但有点过分了)。

angular.module('MyApp')
.directive('MyDirective', ['$templateCache', function($templateCache) {
    return {
        restrict: 'E',
        template: $templateCache.get('MyTemplate').data,
        controller: 'MyController',
        controllerAs: 'MyController'
    };
}]).run(function($templateCache, $http) {
    $http.get('templates/MyTemplate.html').then(function(response) {
        $templateCache.put('MyTemplate', response);
    })
});

希望对您有所帮助!