ng-bind-html doesnt work for Input tags
我试图将HTML存储在范围变量内,然后在模板视图中使用它。 当我阅读如何以角度进行此操作时,遇到了ng-bind-html。 在那我注意到,当我用,等绑定html标签时,它可以工作。 但是我无法在其中添加标签。
意思是,这有效:
1
| $scope.myHtml = 'This is Something'; |
模板:
1 2
| <p ng-bind-html="myHtml">
</p> |
但这不起作用:
1
| $scope.myHtml = '<input type="text" />'; |
模板:
1 2
| <p ng-bind-html="myHtml">
</p> |
上面只是一个简化的示例,仅用于演示目的。 我的问题是:
1)标签不能与ng-bind-html指令一起使用吗?
2)如果没有,我如何html绑定输入标签,以便可以将其插入视图中?
-
它可能没有,在插入html之前先对其进行清理,并且我认为输入被认为是不安全的。为什么需要这样做。看起来很乱,我确定使用模板或指令有更好的方法。
-
我实际上是想在一个复杂的指令中使用它,该指令根据属性选择构造用于输入的html标签,然后在通过$http get获取的模板中使用它。
-
您在该指令中使用compile函数吗?
-
是的..最后编译它。
-
当我现在搜索时,我碰巧遇到了$sce.trustAsHtml()函数。我认为这可能有效。请尝试一下,很快就会更新。 :)
-
好。如果不是这样,我仍然认为您可以不必使用ng-bind-html或类似方法来执行此操作,方法是在指令指令定义对象中声明compile函数并在其中更改模板。
-
啊...真有趣。我将尝试您的建议。
-
嗨@EdHinchliffe,当您建议在指令指令定义中声明编译函数时,是否引用了以下wickY26示例之类的内容?
-
抱歉耽搁了。我的意思不是@ wickY26的建议,但这听起来像是您找到了适合您的解决方案了:)
-
是的.. @ wickY26的指令方法是我正在使用的atm。由于这是一个指令指令定义,所以我认为那也是您所建议的。无论哪种方式,我都很高兴我最终选择了ng-bind-html。 :)
您收到$ sce:unsafe错误...
这意味着您应该使用ng-bind-html-unsafe,但是较新版本的angularjs不再包含此指令,因此您应该像这样使用$ sce.trustAsHtml()。
1
| $scope.trustedInputHtml = $sce.trustAsHtml('<input type="text" />'); |
但是这种方式不能将范围变量绑定到html,因此最好的方法是编写一个可以用ng-bind-html-unsafe替换的指令。
这里正在为$ sce和指令示例工作PLUNKER ...
-
爱它!我将测试您的工作样本。感谢您提供的出色示例。在我的应用中对其进行测试后,我将提供更新。
-
如果您不想为此创建自定义指令,则@blackops_programmer也可以查看我的更新...
-
谢谢您的回答。在ng-bind-html之前使用$sce.trustAsHtml()起作用。但是,最后,在接受您的建议并接受EdHinchliffe和Whishers的建议之后,我最终选择了指令。而且更好的是,我什至不需要使用清理模块来使它工作。非常感谢。今天我花了几个小时搜索这个!我很高兴有一个干净的方法可以实现这一目标。您上面的Plunker示例有很大帮助。多谢! :)
-
此处谈论的指令@ wickY26只是compile指令:docs.angularjs.org/api/ng/service/$compile重命名为^^
-
哇!正是我在这里寻求解决问题的方法:单击此处。非常感谢!
我会将您插入的内容保留在自己的模板中,并使用ng-include(http://docs.angularjs.org/api/ng/directive/ngInclude)。
具有包含内容的角度模板(template.html):
您可以将其包含在
1 2
| <p ng-include="template.html">
</p> |
结果导致……
1 2
| <p ng-include="template.html"><span class="ng-scope">This is Something</span>
</p> |
Angular使用ng-bind-html选择性地清除某些HTML标签
因此,如果您想要所有标签,则应改用ng-bind-html-unsafe
但是要当心XSS攻击!
BTW
最好遵循@Ed Hinchliffe的建议
-
我认为ng-bind-html-unsafe在最新版本中不再起作用。
-
我检查了1.2.16版本,它可以正常工作