我有一个带有控制器的html文件和带有模板url的指令。我想有条件地在控制器中加载/编译指令:
app.controller('TestController', function TestController($http, $scope, $compile) { $scope.loadData = function (pageId) { var pUrl = <some url> $http({ method: 'GET', url: pUrl }).success(function (data, status) { $scope.pData = data; var htm = '<test-directive></test-directive>'; var elm = angular.element("#id").append(htm); $compile(elm)($scope); }).error(function (data, status) { alert('error'); }); }; $scope.loadData(); });
'use strict'; app.directive('testdirective', function ($http) { var uDirective = {}; uDirective.restrict = 'E'; uDirective.templateUrl = 'js/directives/testdirective.html'; uDirective.controller = function ($scope, $element, $attrs) { $scope.showDirectiveData(); $scope.showDirectiveData = function () { $scope.directiveDataCollection = <get data>; }; }; uDirective.compile = function (element, attributes) { // do one-time configuration of element. var linkFunction = function ($scope, element, atttributes) { }; return linkFunction; }; return uDirective; });
<div> <div ng-repeat="directiveData in directiveDataCollection"> <span><h4>{{directiveData.Title}}</h4></span> </div> </div>
我如何在TestController中编译代码,动态加载指令,最后加载内容并将内容附加到范围中?
这是一个抽象的通用模板,供您参考,并演示了一些Angular概念:
JS
.directive('parentDirective', function(Resource, $compile){ return { restrict: 'E', link: function(scope, elem, attrs){ Resource.loadData().then(function(result){ scope.data = result.data; var htm = '<child-directive></child-directive>'; var compiled = $compile(htm)(scope); elem.append(compiled); }); } } }) .directive('childDirective', function(){ return { restrict: 'E', template: '<div>Content: {{data.key}}</div>' } }) .factory('Resource', function($http){ var Resource = {}; Resource.loadData = function(){ return $http.get('test.json'); } return Resource; })
HTML
<body ng-app="myApp"> <parent-directive></parent-directive> </body>
请注意,没有控制器代码。这是因为 控制器永远不要操纵DOM- 原因之一是它将使您的代码成为要测试的PITA。因此,我将所有内容都放入了指令中,在您的情况下也应该放在其中。
我还将$ http服务移到了工厂。与状态/模型相关的任何内容都应该在服务中。除其他原因外,通过执行此操作,您可以将其注入几乎任何位置(包括指令内部)以访问数据,而不必担心控制器卸载时数据会消失。
编辑
您还应该在公认的动态添加Angular指令的答案中考虑动态加载方法的不同观点。