从本地预加载 (JST) 模板缓存加载 ng-include 部分内容
-
24-12-2019 - |
题
我已将模板预加载到 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 哈希。如果有效,将发布结果。
解决方案
这是我发现可行的解决方案,它不像我之前想的那样是一个黑客(上面:-)基本上,使用标准 $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 模板允许我们捆绑所有模板并在初始化期间将它们加载到应用程序中,并避免在获取部分模板和其他模板内容时通常需要的额外服务器往返。
上面的补丁使所有这些都可以与 Angular 一起使用。
其他提示
代替 ng-include
, , 使用 ng-bind-html
:
<div ng-bind-html="t"></div>
在您的控制器上,将模板放在 $scope
:
$scope.t = JST['firstTemplate'];
您需要包括 ngSanitize
作为子模块(不要忘记添加 angular-sanitize.js
也):
angular.module('app', ['ngSanitize']);
今天我遇到了同样的问题,这是我的解决方案:
自定义指令,返回 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
包含我们在指令中提供的值。
欢呼,尼克拉斯