【发布时间】:2017-11-22 23:06:00
【问题描述】:
在我的应用程序的一部分中,我有一个用户正在编辑单页信息(通过 HTML 编辑器:内容工具)。我已经开始修改该功能代码,以便他们正在编辑的页面使用动态模板构建,而不是硬编码。
目前我将已编辑/可编辑的数据存储在数据库表中。我还将模板定义存储在数据库表中。我使用的模板只是之前硬编码的 HTML 代码,所以我知道模板是有效的。
此时,我可以正确地从服务器接收到 JSON 包装器中的所有数据。不工作的是呈现内容——页面保持空白。我确定问题在于我对 AngularJS 及其执行方式缺乏了解。
[更新:在使用@Wes H 和@31PIY 的输入重新处理后,代码和以下执行描述已更新。显然,不再是 $templateCache 问题。] 具体来说,我的 HTML 是:
<body ng-app>
<div ng-controller="PageEditController">
<div ng-bind-html="renderHtml(htmlTemplate)"></div>
</div>
</body>
[注意:renderHtml 是我对 $sce.TrustAsHtml() 的包装,以确保 HTML 不会被 Angular 剥离]
我的 javascript 的相关部分是:
$http({
method: 'POST',
url: 'https://my-api-access-point',
data: parms
}).then(function successCallback(response) {
var resp = response.data['Items'];
var data = {};
if (resp)
data = resp[0];
console.log("jsLoadScreen Data: ", data);
$scope.models.fields = data;
console.log('replacing template: ', $scope.models.fields['template']);
$scope.htmlTemplate = $scope.models.fields['template'];
控制台输出为:
jsLoadScreen Data: {UID:"1"
left:"<h1>↵ One↵</h1>"
right:"<h2>↵ Two↵</h2>"
screenId:"1"
template:" <div class="row">↵ <div class="column">↵ <div data-editable data-name="left" ng-bind-html="renderHtml(models.fields.left)">↵ </div>↵ </div>↵ <div class="vl"></div>↵ <div class="column">↵ <div data-editable data-name="right" ng-bind-html="renderHtml(models.fields.right)">↵ </div>↵ </div>↵ </div>"
replacing template: <div class="row">
<div class="column">
<div data-editable data-name="left" ng-bind-html="renderHtml(models.fields.left)">
</div>
</div>
<div class="vl"></div>
<div class="column">
<div data-editable data-name="right" ng-bind-html="renderHtml(models.fields.right)">
</div>
</div>
</div>
我已验证页面上正在加载模板代码(通过“查看源代码”)。但是,一旦加载,模板代码中的任何 javascript 或 AngularJS 标记都不会执行。
我已经尝试了几个步骤来执行此代码,包括在我的承诺中添加另一个.then() 以触摸模板中的一些变量以强制刷新,以及各种导致进程延迟的不幸尝试万一有比赛条件。没有运气。
对于AngularJS,我是否处于如此陌生的水域,我应该放弃并在服务器端组合模板和数据,并使其成为一个单一的AJAX操作,而不是尝试做两步:(1)AJAX插入新的HTML模板,一旦插入然后 (2) AJAX 将新数据插入新的 HTML 模板?或者我应该对新插入的模板(或在插入模板时)做些什么来将其注册为 javascript 执行的东西?
我在 SO 上看到的最接近的描述是:How $templateCache works? 和 Load HTML template from file into a variable in AngularJs,但我无法完全理解他们所说的内容以及我未成功尝试做的事情。
更新: 在完成了以下先前的回复后,我更接近了。使用来自@Wes H 和@31piy 的信息,我现在已经验证了 HTML 已正确加载到页面上(如 Chrome 开发人员工具中的“查看源代码”所示)。但是,Angular 似乎无法解释各种 Angular 命令(ng-bind-html(renderHtml...))和第 3 方工具触发器(数据可编辑),因此我有 HTML 但没有与相关的 javascript 活动它。我的猜测是插入的 HTML 模板以某种方式放入了 DOM 中,但实际上并未被 Angular(或 javascript)识别和执行。想法?
【问题讨论】:
标签: angularjs templates browser-cache