一尘不染

如何将指令动态加载到页面中

angularjs

我有一个带有控制器的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中编译代码,动态加载指令,最后加载内容并将内容附加到范围中?


阅读 271

收藏
2020-07-04

共1个答案

一尘不染

这是一个抽象的通用模板,供您参考,并演示了一些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指令的答案中考虑动态加载方法的不同观点。

2020-07-04