当前位置: 首页 > 面试题库 >

使用AngularJS将HTML插入并解析到视图中

傅啸
2023-03-14
问题内容

我所知道的是,当我想在视图中插入HTML时,我使用'ng-bind-html''ng-bind-html-unsafe'

我不知道的是如何插入HTML并使Angular解析其内容

即如果有'ng-repeat',我想Angular解析吗?

更新1:

例:

HTML:

<div ng-repeat="t in ts" ng-bind-html-unsafe="t.html()"></div>

JS:

function Controller($scope) {
    $scope.ts = {obj1: new obj(), obj2: new obj(), ob3: new obj()};

}

function obj() {
    // which may be "<div ng-repeat="s in somthing">{{s}}</div>"
    // or "<ul><li ng-repeat="s in somthing">{{s.k}}</li></ul>"
    // or something else
    var _html;

    this.html = function() {
        return _html;
    }
}

我尝试使用上面的方法,但是Angular {{s}}还是{{s.k}}按原样打印。


问题答案:

您可以使用$compile服务(docs)将任意HTML编译为角度视图。

app.run(function($rootScope, $compile, $rootElement) {
  // We'll create a new scope to use as the context for the view.
  $scope = $rootScope.$new();
  $scope.model = [{name: 'first'}, {name: 'second'}, {name: 'third'}];

  // Calling `$compile(html)` returns a function that, when called with
  // a context object, links the compiled HTML to the given context (e.g.
  // binds scope-based expressions in the view to the passed in scope).
  var html = "<div ng-repeat='m in model'>{{m.name}}</div>";
  var linkingFunction = $compile(html);
  var elem = linkingFunction($scope);

  // You can then use the DOM element like normal.
  $rootElement.append(elem);
});

在这种情况下,我已经将视图附加到了$rootElement(这是引导模块时使用的元素,通常是通过ng- app指令);在许多情况下,您将在指令的链接函数中执行此类操作,并且可以访问有问题的元素。当然,您可以使用jQuery或jqLit​​e获取原始HTML,但切记在链接作用域上至少允许一个摘要循环(否则,HTML尚未使用作用域中的值进行更新)

工作示例:http :
//jsfiddle.net/BinaryMuse/QHhVR/

ng- include指令的最底层,Angular正在做这件事:

$compile(currentElement.contents())(currentScope);

[更新]

这是一个更完整的示例,它说明了一些与您更新的问题更接近的内容:

app.controller("MainController", function($scope) {
  $scope.ts = [
    {
      elements: ['one', 'two', 'three'],
      html: '<div ng-repeat="elem in t.elements">{{elem}}</div>'
    },
    {
      things: [8, 9, 10],
      add: function(target) {
        var last = target[target.length - 1];
        target.push(last + 1);
      },
      html: '<ul><li ng-repeat="num in t.things">{{num}}</li>' +
        '<li><button ng-click="t.add(t.things)">More</button></li></ul>'
    }
  ];
});

app.directive("bindCompiledHtml", function($compile, $timeout) {
  return {
    template: '<div></div>',
    scope: {
      rawHtml: '=bindCompiledHtml'
    },
    link: function(scope, elem, attrs) {
      scope.$watch('rawHtml', function(value) {
        if (!value) return;
        // we want to use the scope OUTSIDE of this directive
        // (which itself is an isolate scope).
        var newElem = $compile(value)(scope.$parent);
        elem.contents().remove();
        elem.append(newElem);
      });
    }
  };
});



<div ng-controller="MainController">
  <div ng-repeat="t in ts" bind-compiled-html="t.html"></div>
</div>

工作示例:http :
//jsfiddle.net/BinaryMuse/VUYCG/

这是一文不值的HTML片段使用t.elements,并t.things因为t是由创建范围值ng-repeat外部
HTML。如果愿意,您可以进行一些体操锻炼,以使其变得更好一点。



 类似资料:
  • 问题内容: 是否可以在AngularJS控制器中创建 HTML 片段并将该HTML显示在视图中? 这是因为需要将不一致的JSON Blob转换为嵌套的对对列表。因此,在控制器中创建了 HTML ,现在我希望显示它。 我已经创建了模型属性,但是如果不打印 HTML 便无法在视图中呈现它。 更新资料 看来问题出在将创建的HTML角化为引号内的字符串而引起。将尝试找到解决此问题的方法。 控制器示例: 示

  • 问题内容: 是否可以在AngularJS控制器中创建 HTML 片段并将该HTML显示在视图中? 这是因为需要将不一致的JSON Blob转换为嵌套的对对列表。因此,在控制器中创建了 HTML ,现在我希望显示它。 我已经创建了一个模型属性,但是如果不打印 HTML 便无法在视图中呈现它。 更新资料 看起来问题出在将创建的HTML角化为引号内的字符串而引起。将尝试找到解决此问题的方法。 控制器示例

  • 我正在尝试解析一个映射并更新其中的值。。。下面是我制作hashmap的.txt文件的内容 第一行是键,JSON字符串是值。 这是我的解析代码: 我正在发送一个名为params的有效负载字符串,该字符串由“|”分隔符分隔。它们的输入必须有18个参数(在“|”分隔符之间有18个值)。我解析输入,如果它没有足够的参数,我会得到包含字符串“not_ough_parameters”的键,然后得到它的值,即J

  • 我有一个适用于当地交通时间的Android应用程序,例如公共汽车、渡轮和地铁,需要在线和离线工作。 当应用程序需要脱机工作时,我需要不断更新其数据库。然而,我没有从市政府获得任何类型的网络服务或数据库。因此,我准备了一个PHP脚本,它将解析市政网页中的html内容,并为每辆公交车、每辆地铁(从哪里到哪里)和每辆渡轮(类似于地铁)的组合提取时间。然而,我的问题是从这里开始的。解析大约10万条记录的所

  • 问题内容: 总而言之,我们正在使用AngularJS开发一个Web应用程序,并且我们有一个用例/需求(根本不会经常发生),在此我们需要从静态服务器中检索完整的HTML文档。但是,似乎$ http对象返回了原始HTML字符串作为其“数据”。我们试图避免使用外部库(例如jQuery),但是我们需要将该原始HTML字符串解析为可查询的DOM对象。我们可以使用iframe并完成它,但是出于众所周知的原因,

  • 我有一些html代码,例如, <代码> 我想将代码复制并粘贴到富文本格式,这样可以将html代码解析为真正的DOM。 我知道有js clipBoardData、zeroClipBoard、clipBoard polyfill,但它们都存在兼容性问题。我想写一个,它可以适用于大多数浏览器,我如何才能做到这一点?有什么想法吗? 在我看来,每个浏览器都可以解析html代码,而我复制的东西也是用html写