angularjs – 在元素中插入一个有角度的js模板字符串
发布时间:2020-12-17 08:31:58 所属栏目:安全 来源:网络整理
导读:我试图把一些角度的js模板字符串在一个元素,并期望一个编译的输出。但这不是发生。 HTML div ng-controller="testController" div ng-bind-html-unsafe="fruitsView"/div/div 控制器: function filterController($scope){ ... $scope.arr = ["APPLE","BANA
我试图把一些角度的js模板字符串在一个元素,并期望一个编译的输出。但这不是发生。
HTML <div ng-controller="testController"> <div ng-bind-html-unsafe="fruitsView"></div> </div> 控制器: function filterController($scope){ ... $scope.arr = ["APPLE","BANANA"]; $scope.fruitsView = '<div><p ng-repeat="each in arr">{{each}}</p></div>'; } 输出只是{{each}}。 那么如何在一个元素里面插入一个angular js模板字符串(这里$ scope.fruitsView)? 我为此做了一个fiddle。
在这种情况下,你不想只是“插入HTML”,而是编译它。您可以使用$ compile服务创建DOM节点。
var tpl = $compile( '<div><p ng-repeat="each in arr">{{each}}</p></div>' )( scope ); 正如你所看到的,$ compile返回一个函数,它将一个作用域对象作为参数,对其进行代码评估。例如,可以将结果内容插入到带有element.append()的DOM中。 重要说明:但是在任何情况下,任何与DOM相关的代码都不属于您的控制器。适当的地方总是一个指令。这个代码可以很容易地被引入到一个指令,但我不知道为什么你在程序中插入所有的HTML。 你能在这里散发一些光,所以我可以提供一个更具体的答案吗? 更新 假设您的数据来自服务: .factory( 'myDataService',function () { return function () { // obviously would be $http return [ "Apple","Banana","Orange" ]; }; }); 你的模板来自一个服务 .factory( 'myTplService',function () { return function () { // obviously would be $http return '<div><p ng-repeat="item in items">{{item}}</p></div>'; }; }); 然后创建一个简单的指令,读取提供的模板,编译它,并将其添加到显示: .directive( 'showData',function ( $compile ) { return { scope: true,link: function ( scope,element,attrs ) { var el; attrs.$observe( 'template',function ( tpl ) { if ( angular.isDefined( tpl ) ) { // compile the provided template against the current scope el = $compile( tpl )( scope ); // stupid way of emptying the element element.html(""); // add the template content element.append( el ); } }); } }; }); 然后从您的视图: <div ng-controller="MyCtrl"> <button ng-click="showContent()">Show the Content</button> <div show-data template="{{template}}"></div> </div> 在控制器中,你只需将它们绑在一起: .controller( 'MyCtrl',function ( $scope,myDataService,myTplService ) { $scope.showContent = function () { $scope.items = myDataService(); // <- should be communicated to directive better $scope.template = myTplService(); }; }); 它应该都在一起工作! PS:这是假设你的模板来自服务器。如果没有,那么你的模板应该在指令中,这简化了事情。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |