【问题标题】:display HTML pages dynamically AngularJS动态显示 HTML 页面 AngularJS
【发布时间】:2015-07-15 17:37:35
【问题描述】:

您好,我找不到合适的解决方案。请帮帮我。

我在页面中有一个带有 ui-selects 的单页应用程序,基本上它是用于目录列表的。用户将选择文件夹,最后当他/她在列表中选择一个 HTML 文件时,我正在生成一个 url,我必须在我的 spa 中显示 html 文件。我能够显示文本文件,但我不知道如何显示 html 文件。我尝试了 ng-bind-html,但不知道如何显示。

我正在使用 $http.get 方法获取 html 的内容,并将 html 内容存储在一个名为“contentHTML”的变量中,我需要显示它

【问题讨论】:

    标签: javascript html angularjs


    【解决方案1】:

    您的问题与角度消毒有关。除非您将 HTML 内容粘贴到标记为受信任 HTML 的特殊变量中,否则它不会让您使用 ng-bind-html。 Angular 让你这样做是为了让你知道你非常明确地告诉 Angular 可以渲染这个标记。

    它有助于保护普通开发人员免于意外呈现未编码的用户输入,这将是非常危险的。您不希望用户在输入字段中提交 javascript,然后让您的应用将该脚本直接呈现到页面中的某个位置。如果是这样,恶意脚本会在渲染时运行,并可能造成各种破坏。

    您需要在应用的依赖项中包含ngSanitize 模块。

    var app = angular.module('myApp', ['ngSanitize']);
    

    不要忘记在脚本引用中包含 angular-sanitize 库。

    <script src="//ajax.googleapis.com/ajax/libs/angularjs/X.Y.Z/angular-sanitize.js"></script>
    

    然后,您需要使用$sce 服务将您的 HTML 内容标记为可以安全呈现。

    app.controller('myController', function ($scope, $sce) {
      $scope.trustedHtml = $sce.trustAsHtml(contentHTML);
    });
    

    只有这样ng-bind-html 才能工作。

    <div ng-bind-html="trustedHtml"></div>
    

    演示:http://codepen.io/Chevex/pen/xGYydr?editors=101

    【讨论】:

    • 您好,感谢您的详细回答,它正在工作,但只显示了 html 的文本元素,html 文件中有图形、图表和表格,它们没有显示出来跨度>
    • 您可以在codepen 中复制它,以便我看一下吗?
    • 我要显示的 html 在本地 Intranet 中,我尝试创建一个 html,然后在 codepen 中复制它....通过 ng-bind-html,是否有必要html页面是静态的吗?
    • 哦...我没有意识到这是一个完整的 HTML 页面。嗯,这就是为什么。您正在尝试在另一个 HTML 页面中呈现完整的 HTML 页面。该文件应该只包含 body 标记的内容。您可以将脚本和样式标签移动到正文内容中。我以为你是在拉下一大块 HTML,但不是完整的文档,因为你试图用 angular 在页面上显示它。
    • 查看this answer 了解他们如何使用 Jquery 提取正文内容。 Angular 在幕后使用 jquery。您可以用anguler.element 代替所有$ 调用。为方便起见,您可以使用var $ = angular.element;。您还可以使用它将脚本标签移动到底部。 $('script').append('body');。这会将所有脚本标签移动到正文的底部。
    【解决方案2】:

    我想你正在寻找ngInclude
    您甚至不需要处理 AJAX 请求,它已经为您完成了。

    获取、编译并包含一个外部 HTML 片段。

    用法

    <ANY
      ng-include="path_of_your_file.html"
      [onload="string"]
      [autoscroll="string"]>
      ...
    </ANY>
    

    需要注意的重要事项:

    • 您的 HTML 文件必须位于同一域中,否则会变得复杂(请参阅文档)
    • 这是一个模板,意思是:
      • 所有相对路径都将相对于当前路径,而不是导入模板的路径
      • 将评估其中的 Angular

    【讨论】:

    • 嗨,ng-include 不工作.... html 文件不在本地目录中,这就是它没有被加载的原因吗?
    • 在哪个目录下?只要它在同一个域上并且使用相同的协议,它就可以工作。
    • @swordfish12 你的意思是你从互联网上获取 html 文件,一个不同的网页?即使这样 ng-include 工作
    • 是的,....我需要显示的html位于Intranet中......但是它不起作用,它不显示任何东西
    • @swordfish12 内网是指同一个域?
    【解决方案3】:

    要从 contentHtml 显示您的 html,您需要在您的 html 页面上有一个 div,例如:

    <div ng-controller="htmlBucket">
        {{content}}
    </div>
    

    那么在你的javascript中你应该有这个

    app.registerCtrl('htmlBucket', function($scope)
    {
       $scope.content =  $sce.trustAsHtml(contentHTML); 
    });
    

    不要忘记在 HTML 中包含 .js、jquery 和 angular 依赖项

    <script src="lib/jquery/jquery.js"></script>
    <script src="lib/angular/angular.js"></script>
    

    希望对你有帮助。

    【讨论】:

    • 这将呈现标记编码。这意味着它将在呈现绑定变量时将字符串"&lt;h1&gt;hi&lt;/h1&gt;" 转换为"&amp;lt;h1&amp;gt;hi&amp;lt;/h1&amp;gt;"
    • 是的,这就是您将&amp;lt;h1&amp;gt;hi&amp;lt;/h1&amp;gt; 粘贴到网页中的情况,它会将源呈现为要显示的页面内容。即你会在页面上看到&lt;h1&gt;hi&lt;/h1&gt; 以纯文本形式显示。 Demo
    • 要将内容显示为 Html 试试这个: $scope.content = $sce.trustAsHtml(contentHTML);
    • @carlos 要做到这一点,您首先需要包含 ngSanitize 作为应用依赖项。我的回答详细介绍了$sce 服务:)
    • @swordfish12 我的猜测是您的图形、图表和表格需要一些 javascript 或 CSS 才能运行,但无法正常加载/运行。只是一个猜测。一旦你有代码笔,我会知道更多。
    【解决方案4】:

    您可以使用 ui-router 实现您想要的。 Here 是相同的链接。

    一旦用户选择文件夹,就使用 ui-select。在您的控制器中编写一个事件触发器以将 url 更改为您预定义的。使用 $stateProvider。你也可以看到他们的例子同样here

    希望有帮助

    【讨论】:

      猜你喜欢
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 2017-05-11
      相关资源
      最近更新 更多