4

我将我的模板预加载在一个 javascript 字符串数组中,例如var t = JST['firstTemplate'],在哪里t

<div>This scope has a value of {{value}}</div>

如何在ng-include指令中使用这个预加载的模板?

请注意,我在这种情况下的模板可能更复杂,可能包含嵌套视图和模板以及它们自己的嵌套范围和控制器。所以我不确定是否有任何 ng-bind 指令会有所帮助?

更新:

查看它的来源ng-include似乎是一个很好的方法是将模板加载逻辑解耦到可定制的提供程序中。

当前的默认加载机制只是简单地$http.get使用$templateCache作为缓存提供程序。似乎我可以将模板内容JST['firstTemplate']注入模板缓存,但我必须在启动时为每个模板执行此操作。

$templateCache.put('firstTemplate', JST['firstTemplate']);

然后有,

<div ng-include="firstTemplate"></div>

我还可以编写一个与每个 ng-include 并行的自定义指令,以某种方式对模板进行预缓存。这又显得笨重了。

更新#2

我将尝试覆盖 templateCache,以便它使用我已经预加载的 JST 哈希。如果可行,将发布结果。

4

3 回答 3

6

这是我发现可行的解决方案,它不像我之前想的那样(上面:-) 基本上,使用标准 $provide.decorator 装饰 $templateCache.get 方法,以便缓存可以在我的本地预加载中查看缓存。它只是工作。

angular.module('app').config([
  '$provide', 
  function($provide) {
    $provide.decorator('$templateCache', function($delegate, $sniffer) {
      var originalGet = $delegate.get;

      $delegate.get = function(key) {
        var value;
        value = originalGet(key);
        if (!value) {
          // JST is where my partials and other templates are stored
          // If not already found in the cache, look there...
          value = JST[key]();
          if (value) {
            $delegate.put(key, value);
          }
        }
        return value;
      };

      return $delegate;
    });

    return this;
  }
]);

如果您想知道为什么我在 JST 中有这些东西,我们使用 rails 后端和 rails 资产管道来交付所有 angular 资产。JST 模板允许我们捆绑所有模板并在初始化期间将它们加载到应用程序中,并避免在获取部分和其他模板内容时通常需要的额外服务器往返。

上面的补丁使所有这些都适用于角度。

于 2014-02-28T16:06:45.397 回答
0

而不是ng-include,使用ng-bind-html

<div ng-bind-html="t"></div>

在您的控制器上,将模板放在$scope

$scope.t = JST['firstTemplate'];

您将需要包含ngSanitize为子模块(不要忘记添加angular-sanitize.js):

angular.module('app', ['ngSanitize']);
于 2014-02-27T21:47:07.963 回答
0

今天我遇到了同样的问题,这是我的解决方案:

一个自定义指令,它返回 JST“server/info”作为模板:

/* jstTemplate.js */

/**
 * @desc template loader for JST templates
 * @example <div jst-template="server/info.html"></div>
 */


angular
    .module('myApp')
    .directive('jstTemplate', jstTemplate);

function jstTemplate() {
    return {
        restrict: 'A',
        template: function(element, attrs) {
            return JST[attrs.jstTemplate]();
        }
    }
};

用法:

<div class="box">
    <div jst-template="server/info.html"></div>
</div>

attrs.jstTemplate包含我们在指令中提供的值。

干杯,尼克拉斯

于 2017-07-25T09:21:06.277 回答