动态创建角度视图

Posted

技术标签:

【中文标题】动态创建角度视图【英文标题】:Dynamically creating an angular view 【发布时间】:2012-08-16 06:47:46 【问题描述】:

我正在使用 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。

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

【问题讨论】:

【参考方案1】:

您应该$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 : How to get dynamic content working in angularjs

【讨论】:

我会接受这个答案,因为它使用 html 字符串而不是对 HTML 文件的引用,因此更接近我原来的问题 :)【参考方案2】:

您可能希望将 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 操作放入控制器不是角度方式。)

【讨论】:

我知道 DOM 操作不是角度方式,但不幸的是,由于游戏 UI 系统的工作方式,这是不可避免的 :( 通过 angularjs,看起来如果控制器进行 DOM 操作,它更像是一个“服务”而不是一个控制器。然后可以将服务注入到 Controller 中使用。但同样,服务应该有尽可能少的 DOM 操作,因为这样它就不适合测试了。

以上是关于动态创建角度视图的主要内容,如果未能解决你的问题,请参考以下文章

XML动态创建

给类以角度动态创建的按钮

在角度控制器中动态创建剑道网格列

如何以角度动态创建 n 级嵌套展开/折叠组件

动态创建视图

使用 ngFor 的角度动态表