16

我正在使用 awesomium 制作游戏中的 UI,在某些时候游戏会加载并执行一段 javascript,用于创建任意新的 UI 元素。例如

jQuery(document.body).append('<span class="game-status-alert">You Lose!</span>');

这很好用,当我想创建一些更高级的 UI 元素,特别是使用 Angular 时,问题就来了。例如:

function ChatBoxControl($scope) { /* Stuff */ }

jQuery(document.body).append(
    '<div ng-controller="ChatBoxControl"><div ng-repeat="line in chat"><span>{{line}}</span></div></div>'
);

毫不奇怪,这不会创建新的角度视图。它只是将该 html 添加到文档中,并且从不绑定到 ChatBoxControl。

我怎样才能在这里实现我想要做的事情?

4

2 回答 2

23

您应该$compile动态添加角度内容。就像是:

jQuery(document.body).append(
    $compile(  
        '<div ng-controller="ChatBoxControl"><div ng-repeat="line in chat"><span>{{line}}</span></div></div>'
    )(scope)
);

您可以使用以下内容获得的任何元素的范围:

var scope = angular.element('#dynamicContent').scope();

您还应该获得可以注入其他控制器的 $compile 。

另请参阅:AngularJS + JQuery:如何在 angularjs 中获取动态内容

于 2012-08-21T06:30:53.107 回答
5

您可能希望将 ng-include 与 ng-repeat 结合使用。这是一个简单的例子:http ://plunker.no.de/edit/IxB3wO?live=preview

  <div ng-repeat="dom in domList" ng-include="dom"></div>

父 $scope 将保留加载到视图中的部分列表。并且 ng-repeat + ng-include 将根据列表进行迭代并显示部分。

在合适的时机,您可以将部分附加到 dom 列表中。例如

$scope.domList.push("chatbox.html");

(顺便说一句,将 DOM 操作放入控制器不是角度方式。)

于 2012-08-21T00:31:49.190 回答