20

私が知っているのは、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;
    }
}

{{s}}上記を使ってみたのですが、Angularはそのままか印刷するだけ{{s.k}}

4

3 に答える 3

44

$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 を取得することもできますが、そうする前に、リンクされたスコープで少なくとも 1 つのダイジェスト サイクルを許可することを忘れないでください (そうしないと、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。これは、外側のHTMLでによって作成されるスコープ値であるt.thingsためです。必要に応じて、スコープ体操を行って、これを少し良くすることもできます。tng-repeat

于 2013-09-09T03:34:01.720 に答える
1

繰り返しの要素のオプションの数が限られている場合は、代わりに ng-switch を使用するか、HTML がサーバーからのものである場合は ng-include を使用できます。

于 2013-09-09T02:49:53.607 に答える