我想建立一个在线的html / css / javascript游乐场。当代码绘制图形时,我希望能够生成一个URL,用户可以使用该URL在浏览器中加载此图形。
目前,在操场上,我有一个链接到功能generateUrl
的按钮:
$scope.generateUrl = function () {
urls.create({
// allCode is a string like "<html><body><canvas ...>...</canvas><script>...</script></html>"
content: $scope.allCode
}).success(function (url) {
alert(url._id)
});
};
然后,我想在浏览器中加载localhost:3000/urls/58a56d0962bd39979d142e27
这样的网址的ID:
app.config(['$stateProvider', function ($stateProvider) {
$stateProvider
.state('urls', {
url: '/urls/{id}',
template: "{{url.content}}",
controller: 'UrlCtrl',
resolve: {
url: ['$stateParams', 'urls', function ($stateParams, urls) {
return urls.get($stateParams.id);
}]
}
})
但是,上面的代码只显示字符串而不是图表:
此外,它嵌入在我的全球<ui-view></ui-view>
的{{1}}中。行为是预期的,但这不是我希望用户在加载index.ejs
时看到的内容。
有谁知道如何设置从生成的网址加载图表?
答案 0 :(得分:2)
我认为您需要使用Angular的Strict Contextual Escaping服务,更多称为$sce
。
严格上下文转义(SCE)是AngularJS在某些上下文中需要绑定以产生标记为可安全用于该上下文的值的模式。这种上下文的一个示例是通过ng-bind-html绑定用户控制的任意html。我们将这些上下文称为特权或SCE上下文。
因此,您可以使用ngBindHtml
指令,而不是普通插值。
<div ng-bind-html="url.content"></div>
或者,您也可以在$sce
解析函数上注入url
并调用trustAsHtml
方法:
resolve: {
url: ['$sce', '$stateParams', 'urls', function ($sce, $stateParams, urls) {
return $sce.trustAsHtml(urls.get($stateParams.id));
}]
}
如果您的HTML代码包含html
和body
标记,我不确定会发生什么。也许你需要删除它们。