HTML 在 NG-Repeater 中有奇怪的结果
HTML in NG-Repeater having strange results
我正在尝试从 JSON 加载 HTML,这样我就可以构建动态页面并构建一个简单的 LMS。
我有以下代码:
控制器
.controller('TestCtrl', function ($scope, $stateParams) {
$scope.options = [
{ row: 1, type: "text", data:"<input type='text' text='no work' placeholder='Email'>", title: 'Number One' },
{ row: 1, type: "text", data: "<p>this works</p>", title: 'Number Two' },
{ row: 1, type: "textbox", data: "<div class='ho'>this works</div>", title: 'Number Two' }
];
});
HTML
<ion-view view-title="Test List">
<ion-content>
<ion-item ng-repeat="item in options">
<div ng-bind-html="item.data"></div>
</ion-item>
</ion-content>
</ion-view>
后两个有效,但第一个 returns 无效。它呈现为(忽略红色箭头):
尝试将第一个输入标签属性从“text”更改为“value”
data:"<input type='text' value='no work' placeholder='Email'>",
关闭输入标签。
data:"<input type='text' value='no work' placeholder='Email' />"
这确实是一个 angular 反模式(html 在你的模型中)。在插值期间输入有可能被剥离(就像脚本标签一样)。
查看 $ngSanitize 和 $sce 的文档。 ng-bind 使用 $sanitize 过滤掉不安全的 html (我相信这包括输入元素)。您可以使用 $sce 覆盖它(不推荐)以告诉 angular 文本是可信的并且不需要通过消毒器。
我认为这可能会让您对需要做什么有所了解。我整理了一个过滤器,可以使 HTML 在 ng-bind-html 指令中安全使用。 Here's a Plunk showing it working.
app.controller('MyController', function($scope, $sce) {
$scope.someHtmlContent = "<i>Label:</i> <input name='test'>";
$scope.h = function(html) {
return $sce.trustAsHtml(html);
};
});
app.filter('trustAsHtml', function($sce) { return $sce.trustAsHtml; });
这是显示它的视图的非 Ionic 版本:
<body ng-controller="TestCtrl">
<ul>
<li ng-repeat="item in options">
<div ng-bind-html="item.data | trustAsHtml"></div> <!-- note the filter -->
</li>
</ul>
</body>
基本上,我创建了一个过滤器 ('trustAsHtml'),通过使用 $sce 服务的 trustAsHTML() 方法告诉 AngularJS 信任您的 HTML( ngSanitize 模块的一部分)。不过,您必须小心,您提供的 HTML 确实可以抵御来自用户等的攻击代码。
我正在尝试从 JSON 加载 HTML,这样我就可以构建动态页面并构建一个简单的 LMS。
我有以下代码:
控制器
.controller('TestCtrl', function ($scope, $stateParams) {
$scope.options = [
{ row: 1, type: "text", data:"<input type='text' text='no work' placeholder='Email'>", title: 'Number One' },
{ row: 1, type: "text", data: "<p>this works</p>", title: 'Number Two' },
{ row: 1, type: "textbox", data: "<div class='ho'>this works</div>", title: 'Number Two' }
];
});
HTML
<ion-view view-title="Test List">
<ion-content>
<ion-item ng-repeat="item in options">
<div ng-bind-html="item.data"></div>
</ion-item>
</ion-content>
</ion-view>
后两个有效,但第一个 returns 无效。它呈现为(忽略红色箭头):
尝试将第一个输入标签属性从“text”更改为“value”
data:"<input type='text' value='no work' placeholder='Email'>",
关闭输入标签。
data:"<input type='text' value='no work' placeholder='Email' />"
这确实是一个 angular 反模式(html 在你的模型中)。在插值期间输入有可能被剥离(就像脚本标签一样)。
查看 $ngSanitize 和 $sce 的文档。 ng-bind 使用 $sanitize 过滤掉不安全的 html (我相信这包括输入元素)。您可以使用 $sce 覆盖它(不推荐)以告诉 angular 文本是可信的并且不需要通过消毒器。
我认为这可能会让您对需要做什么有所了解。我整理了一个过滤器,可以使 HTML 在 ng-bind-html 指令中安全使用。 Here's a Plunk showing it working.
app.controller('MyController', function($scope, $sce) {
$scope.someHtmlContent = "<i>Label:</i> <input name='test'>";
$scope.h = function(html) {
return $sce.trustAsHtml(html);
};
});
app.filter('trustAsHtml', function($sce) { return $sce.trustAsHtml; });
这是显示它的视图的非 Ionic 版本:
<body ng-controller="TestCtrl">
<ul>
<li ng-repeat="item in options">
<div ng-bind-html="item.data | trustAsHtml"></div> <!-- note the filter -->
</li>
</ul>
</body>
基本上,我创建了一个过滤器 ('trustAsHtml'),通过使用 $sce 服务的 trustAsHTML() 方法告诉 AngularJS 信任您的 HTML( ngSanitize 模块的一部分)。不过,您必须小心,您提供的 HTML 确实可以抵御来自用户等的攻击代码。