动态创建角度视图

Mar*_*tin 16 html javascript jquery angularjs

我正在使用awesomium创建一个游戏UI,在某些时候游戏加载并执行一大堆javascript,这意味着创建任意新的UI元素.例如

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

这很好用,当我想创建一些稍微更高级的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>'
);
Run Code Online (Sandbox Code Playgroud)

毫不奇怪,这不会创建一个新的角度视图.它只是将html添加到文档中,并且永远不会绑定到ChatBoxControl.

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

Art*_*eev 23

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

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

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

var scope = angular.element('#dynamicContent').scope();
Run Code Online (Sandbox Code Playgroud)

你也应该得到$ compile,可以注入其他控制器.

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


Tos*_*osh 5

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

  <div ng-repeat="dom in domList" ng-include="dom"></div>
Run Code Online (Sandbox Code Playgroud)

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

当它是正确的时间时,您可以将部分附加到dom列表中.例如

$scope.domList.push("chatbox.html");
Run Code Online (Sandbox Code Playgroud)

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