1

我想建立一个在线 html/css/javascript 游乐场。当代码绘制图表时,我希望能够生成一个 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在浏览器中加载 url 的 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>我的全局index.ejs. 这种行为是意料之中的,但这不是我希望用户在加载时看到的www.mysite.com/urls/58a56d0962bd39979d142e27

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

4

1 回答 1

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

于 2017-02-16T11:58:47.510 回答