- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
http://codepen.io/pondnetic/pen/qdxGVV
我的 ionic 应用程序中显示了一个由几行 html 组成的 javascript 字符串
<div ng-bind-html="strVar | to_trusted"></div>
to_trusted 是一个使用 $sce 的简单过滤器
.filter('to_trusted', ['$sce', function($sce){
return function(text) {
return $sce.trustAsHtml(text);
};
}])
如 codepen 所示,当以这种方式显示 html 时,ng-show 和 ng-hide 不起作用。我怎样才能让它按预期运行?
最佳答案
您当前遇到的问题是 Angular 将您的文本作为 HTML 正确处理,正如您所希望的那样,但在这样做之后,它不会像 Angular 模板那样绑定(bind)到新的属性和类。
这种行为并不是 Angular 设计中的缺陷,而是为了防止特定指令无法使网站完全无响应。想想如果它需要为新的指令和绑定(bind)重新评估每个新生成的 HTML 片段,它很可能会进入一个永无止境的执行和检查循环。
不要使用动态模板
解决问题的第一种方法是改变方法:不要使用动态模板。您想要这样做的原因很可能是允许用户输入生成模板(这成为一个安全问题,XSS 的潜在入口),或者第三方系统正在为您生成 HTML,这这也是一个坏主意,因为关注点与系统分离(如果您的系统应该生成 HTML,它不应该混淆其他来源,更不用说信任它们了)。
使用指令
如果您插入 HTML 的原因是为了重用 HTML,那么您可能正在寻找的是指令,这是一个 Angular 组件,它允许您做到这一点:重用和隔离与生成的 HTML 紧密耦合的行为。
这是来自 directive documentation 的一个简单示例:
动态模板
如果您真的想使用动态模板,有一种方法可以做到。您将以与上述示例完全相同的方式创建一个指令,但不是将模板硬编码到指令(或模板文件)中,您可以动态地将模板的内容提供到 link
函数并使用提供的范围自行编译,如下所示:
angular.module('variableDirective', [])
.controller('Controller', ['$scope', function($scope) {
$scope.customer1 = {
name: 'Naomi',
address: '1600 Amphitheatre'
};
$scope.customer2 = {
name: 'Joseph',
address: '123 Fake St'
};
}])
.directive('myCustomer', function($compile) {
var getTemplate = function(attrs) {
var isVip = attrs.type === "vip";
return isVip
? "(VIP) Name: {{customer.name}} -- (VIP address hidden)"
: "Name: {{customer.name}} -- Address: {{customer.address}}"
};
var linker = function(scope, element, attrs) {
var template = getTemplate(attrs);
element.html(template);
$compile(element.contents())(scope);
};
return {
restrict: 'E',
link: linker,
scope: {
customer: '=info'
}
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="variableDirective">
<div ng-controller="Controller">
<my-customer type="regular" info="customer1"></my-customer>
<br />
<my-customer type="vip" info="customer2"></my-customer>
</div>
</div>
但请注意,这是必要的,因为模板的编译发生在指令实例化之后,因此您无法在指令定义时访问范围或属性。
您可以在此处找到更详细的解释和可重用的方法(我的示例基于该方法):http://onehungrymind.com/angularjs-dynamic-templates/
关于javascript - $sce.trustAsHtml 和 ng-show,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31215145/
内的水平居中垂直文本
我正在尝试将对象数组从 Angular Controller 提供给 ng-repeat 指令。 数组中返回的对象有几个属性,其中一些可能包含需要由ng-repeat结果输出的HTML。我似乎无法弄清
好的,所以我在代码中测试过的以下内容有效: javascript: var string = 'hello'; $scope.html = $sce.trustAsHtml(string); html
我在这里添加了一个 Plunker:http://plnkr.co/edit/4vqV8toHo0vNjtfICtzI?p=preview 我正在尝试向 DOM 添加一个按钮,单击时应该执行绑定(bi
我正在尝试在字符串上运行 $sce.trustAsHtml 。它抛出 Error: $sce:itypeString Value is Required for SCE Trust Call即使我在返
我有一个警报如下: $scope.addAlert('danger', $sce.trustAsHtml('Invalid Alias Name: Certain limitations apply
这是我正在尝试做的事情 $sce.trustAsHtml('') 在我的 HTML 代码中只打印 但我期待ng-class $sce之前要评估的属性返回它。我的代码有点像这样工作 如何做到这一点?
我在一个页面上有 2 个 div。当用户单击 button1 时,iframe 会加载到 div1 中,button2 和 div2 也是如此。 iframe 通过 ajax 加载并通过 $sce.t
我知道 $sce.trustAsHtml() 可以让 AngularJS 按原样显示 HTML。经过一番坐立不安后,我意识到这并不适用于所有情况。特别是当该数据中包含其他标签时。 如果我使用简单的 H
我正在尝试将字符串解析为字符数组,用 包围每个字符。 。提交解析的函数有效,每个字符都被 包围标签。解析函数: app.controller('tableCtrl',function($scope
我正在尝试制作一个自定义过滤器,用 替换新行,像这样: angular.module('appFilters', []).filter('break_lines', ['$sce', functio
我必须呈现一个字符串 (item.tabs.review.content),使用 $sce.trustAsHtml 将其解析为 HTML。 我遇到的主要问题是在字符串中引用了项目对象 (item.ta
我不确定我在这里遗漏了什么,但出于某种原因,我的 iFrame 被呈现为文本而不是 HTML。我们正在使用 Angular 1.3.15。 这是我的看法: 这是我的 Controller : vm.
使用我在相关问题中找到的解决方案 ( How do you use $sce.trustAsHtml(string) to replicate ng-bind-html-unsafe in Angul
我是 AngularJS 的新手,我觉得我只是触及了该框架可能实现的功能的皮毛。但是,我遇到了 sce.trustAsHtml 函数的问题。我正在运行 AngularJS 1.2.4。 在我的应用程序
http://codepen.io/pondnetic/pen/qdxGVV 我的 ionic 应用程序中显示了一个由几行 html 组成的 javascript 字符串 to_trusted 是一
为什么我不能这样做: {{data | htmlfilterexample}} 当我在过滤器内返回时: return $sce.trustAsHtml(input); 使用 无论过滤器是否返回 inp
我面临的问题是我从服务器获取一些代表 html 的字符串我需要解析某些节点的样式属性,然后使用 Angular 在 View 中显示此 html。 所以我看到这个答案 https://stackove
我正在尝试通过将 ng-bind-html 与过滤器一起使用来显示我在 div.testData 中收到的 html 内容。我已经在我的应用程序中包含了“ngSanitize”。但不知何故,它只部分起
我正在用 Angular 编写一个 REST 应用程序,我想为它编写单元测试(当然!)。我有一个 Controller ,它从 json 中的 REST 服务获取博客文章列表,并将摘要放入 $scop
我正在尝试使用 Angular 将自定义 html 打印到屏幕上。我将 $sce.trustAsHtml 与 ng-bind-html 结合使用来完成此任务。目标不仅是能够打印此自定义 html,而且
我是一名优秀的程序员,十分优秀!