从生成的URL加载图表

时间:2017-02-16 11:25:40

标签: javascript html canvas angular-ui-router angular-ui-router-extras

我想建立一个在线的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);
                }]
            }
        })

但是,上面的代码只显示字符串而不是图表:

enter image description here

此外,它嵌入在我的全球<ui-view></ui-view>的{​​{1}}中。行为是预期的,但这不是我希望用户在加载index.ejs时看到的内容。

有谁知道如何设置从生成的网址加载图表?

1 个答案:

答案 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代码包含htmlbody标记,我不确定会发生什么。也许你需要删除它们。